You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/02/06 15:23:42 UTC

[camel] 01/06: CAMEL-14508 - Create an AWS-CloudWatch component based on SDK v2

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

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2c99a2686c746834d565b5408f15ce4e1864614e
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 6 14:56:16 2020 +0100

    CAMEL-14508 - Create an AWS-CloudWatch component based on SDK v2
---
 components/camel-aws2-cw/pom.xml                   |  86 ++++++++
 .../component/aws/cw/CwComponentConfigurer.java    |  33 +++
 .../component/aws/cw/CwEndpointConfigurer.java     |  45 ++++
 .../services/org/apache/camel/component.properties |   7 +
 .../services/org/apache/camel/component/aws-cw     |   2 +
 .../services/org/apache/camel/component/aws2-cw    |   2 +
 .../org/apache/camel/configurer/aws-cw-component   |   2 +
 .../org/apache/camel/configurer/aws-cw-endpoint    |   2 +
 .../org/apache/camel/configurer/aws2-cw-component  |   2 +
 .../org/apache/camel/configurer/aws2-cw-endpoint   |   2 +
 .../org/apache/camel/component/aws/cw/aws-cw.json  |  46 +++++
 .../org/apache/camel/component/aws/cw/aws2-cw.json |  46 +++++
 .../src/main/docs/aws-cw-component.adoc            | 226 +++++++++++++++++++++
 .../apache/camel/component/aws/cw/CwComponent.java | 125 ++++++++++++
 .../aws/cw/CwComponentVerifierExtension.java       |  85 ++++++++
 .../camel/component/aws/cw/CwConfiguration.java    | 203 ++++++++++++++++++
 .../apache/camel/component/aws/cw/CwConstants.java |  31 +++
 .../apache/camel/component/aws/cw/CwEndpoint.java  | 127 ++++++++++++
 .../apache/camel/component/aws/cw/CwProducer.java  | 157 ++++++++++++++
 .../component/aws/cw/CloudWatchClientMock.java     |  27 +++
 .../aws/cw/CwComponentConfigurationTest.java       | 110 ++++++++++
 .../aws/cw/CwComponentRegistryClientTest.java      |  54 +++++
 .../camel/component/aws/cw/CwComponentTest.java    |  82 ++++++++
 .../aws/cw/CwComponentVerifierExtensionTest.java   |  71 +++++++
 .../cw/integration/CwComponentIntegrationTest.java |  62 ++++++
 .../src/test/resources/log4j2.properties           |  28 +++
 core/camel-componentdsl/pom.xml                    |   6 +
 .../component/ComponentsBuilderFactory.java        |  11 +
 .../dsl/Aws2CwComponentBuilderFactory.java         | 157 ++++++++++++++
 .../src/generated/resources/metadata.json          |  20 ++
 30 files changed, 1857 insertions(+)

diff --git a/components/camel-aws2-cw/pom.xml b/components/camel-aws2-cw/pom.xml
new file mode 100644
index 0000000..92a3aeb
--- /dev/null
+++ b/components/camel-aws2-cw/pom.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-aws2-cw</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: AWS2 CW</name>
+    <description>A Camel Amazon CW Web Service Component Version 2</description>
+
+    <properties>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>cloudwatch</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>apache-client</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwComponentConfigurer.java b/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwComponentConfigurer.java
new file mode 100644
index 0000000..1fee35a
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwComponentConfigurer.java
@@ -0,0 +1,33 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws.cw;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class CwComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        CwComponent target = (CwComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.aws.cw.CwConfiguration.class, value)); return true;
+        case "accesskey":
+        case "accessKey": target.setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "region": target.setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwEndpointConfigurer.java b/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwEndpointConfigurer.java
new file mode 100644
index 0000000..401271b
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/java/org/apache/camel/component/aws/cw/CwEndpointConfigurer.java
@@ -0,0 +1,45 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws.cw;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class CwEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        CwEndpoint target = (CwEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "amazoncwclient":
+        case "amazonCwClient": target.getConfiguration().setAmazonCwClient(property(camelContext, software.amazon.awssdk.services.cloudwatch.CloudWatchClient.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "name": target.getConfiguration().setName(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyhost":
+        case "proxyHost": target.getConfiguration().setProxyHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": target.getConfiguration().setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "proxyprotocol":
+        case "proxyProtocol": target.getConfiguration().setProxyProtocol(property(camelContext, software.amazon.awssdk.core.Protocol.class, value)); return true;
+        case "region": target.getConfiguration().setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "timestamp": target.getConfiguration().setTimestamp(property(camelContext, java.time.Instant.class, value)); return true;
+        case "unit": target.getConfiguration().setUnit(property(camelContext, java.lang.String.class, value)); return true;
+        case "value": target.getConfiguration().setValue(property(camelContext, java.lang.Double.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "accesskey":
+        case "accessKey": target.getConfiguration().setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.getConfiguration().setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..a92c78a
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=aws-cw aws2-cw
+groupId=org.apache.camel
+artifactId=camel-aws2-cw
+version=3.1.0-SNAPSHOT
+projectName=Camel :: AWS2 CW
+projectDescription=A Camel Amazon CW Web Service Component Version 2
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws-cw b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws-cw
new file mode 100644
index 0000000..b6084c2
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws-cw
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwComponent
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-cw b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-cw
new file mode 100644
index 0000000..b6084c2
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-cw
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwComponent
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-component b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-component
new file mode 100644
index 0000000..39894df
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwComponentConfigurer
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-endpoint b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-endpoint
new file mode 100644
index 0000000..a42cd28
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-cw-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwEndpointConfigurer
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-component b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-component
new file mode 100644
index 0000000..39894df
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwComponentConfigurer
diff --git a/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-endpoint b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-endpoint
new file mode 100644
index 0000000..a42cd28
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-cw-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.cw.CwEndpointConfigurer
diff --git a/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws-cw.json b/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws-cw.json
new file mode 100644
index 0000000..90a51f4
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws-cw.json
@@ -0,0 +1,46 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "aws-cw",
+    "extendsScheme": "",
+    "syntax": "aws-cw:namespace",
+    "title": "AWS CloudWatch",
+    "description": "The aws-cw component is used for sending metrics to an Amazon CloudWatch.",
+    "label": "cloud,monitoring",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws.cw.CwComponent",
+    "firstVersion": "2.11.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws-cw",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws.cw.CwConfiguration", "deprecated": false, "secret": false, "description": "The AWS CW default configuration" },
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Secret Key" },
+    "region": { "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The region in which CW client needs to work" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the r [...]
+  },
+  "properties": {
+    "namespace": { "kind": "path", "displayName": "Namespace", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric namespace" },
+    "amazonCwClient": { "kind": "parameter", "displayName": "Amazon Cw Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "com.amazonaws.services.cloudwatch.AmazonCloudWatch", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To use the AmazonCloudWatch as the client" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the  [...]
+    "name": { "kind": "parameter", "displayName": "Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric name" },
+    "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the CW client" },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the CW client" },
+    "proxyProtocol": { "kind": "parameter", "displayName": "Proxy Protocol", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "com.amazonaws.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy protocol when instantiating the CW client" },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The region in which CW client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1 [...]
+    "timestamp": { "kind": "parameter", "displayName": "Timestamp", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.util.Date", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric timestamp" },
+    "unit": { "kind": "parameter", "displayName": "Unit", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric unit" },
+    "value": { "kind": "parameter", "displayName": "Value", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric value" },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws2-cw.json b/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws2-cw.json
new file mode 100644
index 0000000..e917368
--- /dev/null
+++ b/components/camel-aws2-cw/src/generated/resources/org/apache/camel/component/aws/cw/aws2-cw.json
@@ -0,0 +1,46 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "aws2-cw",
+    "extendsScheme": "",
+    "syntax": "aws2-cw:namespace",
+    "title": "AWS 2 CloudWatch",
+    "description": "The aws-cw component is used for sending metrics to an Amazon CloudWatch.",
+    "label": "cloud,monitoring",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws.cw.CwComponent",
+    "firstVersion": "3.1.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-cw",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws.cw.CwConfiguration", "deprecated": false, "secret": false, "description": "The AWS CW default configuration" },
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Secret Key" },
+    "region": { "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The region in which CW client needs to work" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the r [...]
+  },
+  "properties": {
+    "namespace": { "kind": "path", "displayName": "Namespace", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric namespace" },
+    "amazonCwClient": { "kind": "parameter", "displayName": "Amazon Cw Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.cloudwatch.CloudWatchClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To use the AmazonCloudWatch as the client" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the  [...]
+    "name": { "kind": "parameter", "displayName": "Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric name" },
+    "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the CW client" },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the CW client" },
+    "proxyProtocol": { "kind": "parameter", "displayName": "Proxy Protocol", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "To define a proxy protocol when instantiating the CW client" },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The region in which CW client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1 [...]
+    "timestamp": { "kind": "parameter", "displayName": "Timestamp", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.time.Instant", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric timestamp" },
+    "unit": { "kind": "parameter", "displayName": "Unit", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric unit" },
+    "value": { "kind": "parameter", "displayName": "Value", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "The metric value" },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.cw.CwConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws2-cw/src/main/docs/aws-cw-component.adoc b/components/camel-aws2-cw/src/main/docs/aws-cw-component.adoc
new file mode 100644
index 0000000..3635351
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/docs/aws-cw-component.adoc
@@ -0,0 +1,226 @@
+[[aws-cw-component]]
+= AWS CloudWatch Component
+
+*Since Camel 2.11*
+
+// HEADER START
+*Only producer is supported*
+// HEADER END
+
+The CW component allows messages to be sent to an
+https://aws.amazon.com/cloudwatch/[Amazon CloudWatch] metrics. The
+implementation of the Amazon API is provided by
+the https://aws.amazon.com/sdkforjava/[AWS SDK].
+
+Prerequisites
+
+You must have a valid Amazon Web Services developer account, and be
+signed up to use Amazon CloudWatch. More information is available at
+https://aws.amazon.com/cloudwatch/[Amazon CloudWatch].
+
+== URI Format
+
+[source,java]
+----------------------------
+aws-cw://namespace[?options]
+----------------------------
+
+The metrics will be created if they don't already exists. +
+ You can append query options to the URI in the following format,
+`?options=value&option2=value&...`
+
+== URI Options
+
+
+// component options: START
+The AWS CloudWatch component supports 6 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *configuration* (advanced) | The AWS CW default configuration |  | CwConfiguration
+| *accessKey* (producer) | Amazon AWS Access Key |  | String
+| *secretKey* (producer) | Amazon AWS Secret Key |  | String
+| *region* (producer) | The region in which CW client needs to work |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AWS CloudWatch endpoint is configured using URI syntax:
+
+----
+aws-cw:namespace
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *namespace* | *Required* The metric namespace |  | String
+|===
+
+
+=== Query Parameters (14 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *amazonCwClient* (producer) | To use the AmazonCloudWatch as the client |  | AmazonCloudWatch
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *name* (producer) | The metric name |  | String
+| *proxyHost* (producer) | To define a proxy host when instantiating the CW client |  | String
+| *proxyPort* (producer) | To define a proxy port when instantiating the CW client |  | Integer
+| *proxyProtocol* (producer) | To define a proxy protocol when instantiating the CW client. The value can be one of: HTTP, HTTPS | HTTPS | Protocol
+| *region* (producer) | The region in which CW client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll need to use the name Regions.EU_WEST_1.name() |  | String
+| *timestamp* (producer) | The metric timestamp |  | Date
+| *unit* (producer) | The metric unit |  | String
+| *value* (producer) | The metric value |  | Double
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *accessKey* (security) | Amazon AWS Access Key |  | String
+| *secretKey* (security) | Amazon AWS Secret Key |  | String
+|===
+// endpoint options: END
+// spring-boot-auto-configure options: START
+== Spring Boot Auto-Configuration
+
+When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:
+
+[source,xml]
+----
+<dependency>
+  <groupId>org.apache.camel.springboot</groupId>
+  <artifactId>camel-aws-cw-starter</artifactId>
+  <version>x.x.x</version>
+  <!-- use the same version as your Camel core version -->
+</dependency>
+----
+
+
+The component supports 19 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.component.aws-cw.access-key* | Amazon AWS Access Key |  | String
+| *camel.component.aws-cw.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
+| *camel.component.aws-cw.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
+| *camel.component.aws-cw.configuration.access-key* | Amazon AWS Access Key |  | String
+| *camel.component.aws-cw.configuration.amazon-cw-client* | To use the AmazonCloudWatch as the client |  | AmazonCloudWatch
+| *camel.component.aws-cw.configuration.name* | The metric name |  | String
+| *camel.component.aws-cw.configuration.namespace* | The metric namespace |  | String
+| *camel.component.aws-cw.configuration.proxy-host* | To define a proxy host when instantiating the CW client |  | String
+| *camel.component.aws-cw.configuration.proxy-port* | To define a proxy port when instantiating the CW client |  | Integer
+| *camel.component.aws-cw.configuration.proxy-protocol* | To define a proxy protocol when instantiating the CW client |  | Protocol
+| *camel.component.aws-cw.configuration.region* | The region in which CW client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll need to use the name Regions.EU_WEST_1.name() |  | String
+| *camel.component.aws-cw.configuration.secret-key* | Amazon AWS Secret Key |  | String
+| *camel.component.aws-cw.configuration.timestamp* | The metric timestamp |  | Date
+| *camel.component.aws-cw.configuration.unit* | The metric unit |  | String
+| *camel.component.aws-cw.configuration.value* | The metric value |  | Double
+| *camel.component.aws-cw.enabled* | Whether to enable auto configuration of the aws-cw component. This is enabled by default. |  | Boolean
+| *camel.component.aws-cw.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed the [...]
+| *camel.component.aws-cw.region* | The region in which CW client needs to work |  | String
+| *camel.component.aws-cw.secret-key* | Amazon AWS Secret Key |  | String
+|===
+// spring-boot-auto-configure options: END
+
+
+
+
+Required CW component options
+
+You have to provide the amazonCwClient in the
+Registry or your accessKey and secretKey to access
+the https://aws.amazon.com/cloudwatch/[Amazon's CloudWatch].
+
+== Usage
+
+=== Message headers evaluated by the CW producer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelAwsCwMetricName` |`String` |The Amazon CW metric name.
+
+|`CamelAwsCwMetricValue` |`Double` |The Amazon CW metric value.
+
+|`CamelAwsCwMetricUnit` |`String` |The Amazon CW metric unit.
+
+|`CamelAwsCwMetricNamespace` |`String` |The Amazon CW metric namespace.
+
+|`CamelAwsCwMetricTimestamp` |`Date` |The Amazon CW metric timestamp.
+
+|`CamelAwsCwMetricDimensionName` |`String` |The Amazon CW metric dimension name.
+
+|`CamelAwsCwMetricDimensionValue` |`String` |The Amazon CW metric dimension value.
+
+|`CamelAwsCwMetricDimensions` |`Map<String, String>` |A map of dimension names and dimension values.
+|=======================================================================
+
+=== Advanced AmazonCloudWatch configuration
+
+If you need more control over the `AmazonCloudWatch` instance
+configuration you can create your own instance and refer to it from the
+URI:
+
+[source,java]
+-------------------------------------------------
+from("direct:start")
+.to("aws-cw://namespace?amazonCwClient=#client");
+-------------------------------------------------
+
+The `#client` refers to a `AmazonCloudWatch` in the
+Registry.
+
+For example if your Camel Application is running behind a firewall:
+
+[source,java]
+------------------------------------------------------------------------------------------
+AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
+ClientConfiguration clientConfiguration = new ClientConfiguration();
+clientConfiguration.setProxyHost("http://myProxyHost");
+clientConfiguration.setProxyPort(8080);
+
+AmazonCloudWatch client = new AmazonCloudWatchClient(awsCredentials, clientConfiguration);
+
+registry.bind("client", client);
+------------------------------------------------------------------------------------------
+
+== Automatic detection of AmazonCloudWatch client in registry
+
+The component is capable of detecting the presence of an AmazonCloudWatch bean into the registry.
+If it's the only instance of that type it will be used as client and you won't have to define it as uri parameter.
+This may be really useful for smarter configuration of the endpoint.
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-aws-cw</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `${camel-version`} must be replaced by the actual version of Camel.
+
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java
new file mode 100644
index 0000000..f76b499
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponent.java
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+
+@Component("aws2-cw")
+public class CwComponent extends DefaultComponent {
+
+    @Metadata
+    private String accessKey;
+    @Metadata
+    private String secretKey;
+    @Metadata
+    private String region;
+    @Metadata(label = "advanced")    
+    private CwConfiguration configuration;
+    
+    public CwComponent() {
+        this(null);
+    }
+
+    public CwComponent(CamelContext context) {
+        super(context);
+        registerExtension(new CwComponentVerifierExtension());
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        if (remaining == null || remaining.trim().length() == 0) {
+            throw new IllegalArgumentException("Metric namespace must be specified.");
+        }
+
+        CwConfiguration configuration = this.configuration != null ? this.configuration.copy() : new CwConfiguration();
+        configuration.setNamespace(remaining);
+
+        CwEndpoint endpoint = new CwEndpoint(uri, this, configuration);
+        // set component level options before overriding from endpoint parameters
+        endpoint.getConfiguration().setAccessKey(accessKey);
+        endpoint.getConfiguration().setSecretKey(secretKey);
+        endpoint.getConfiguration().setRegion(region);
+        setProperties(endpoint, parameters);
+
+        checkAndSetRegistryClient(configuration);
+        if (configuration.getAmazonCwClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("AmazonCwClient or accessKey and secretKey must be specified");
+        }
+
+        return endpoint;
+    }
+
+    public CwConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * The AWS CW default configuration
+     */
+    public void setConfiguration(CwConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * The region in which CW client needs to work
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+    
+    private void checkAndSetRegistryClient(CwConfiguration configuration) {
+        Set<CloudWatchClient> clients = getCamelContext().getRegistry().findByType(CloudWatchClient.class);
+        if (clients.size() == 1) {
+            configuration.setAmazonCwClient(clients.stream().findFirst().get());
+        }
+    }
+}
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtension.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtension.java
new file mode 100644
index 0000000..ad360d0
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtension.java
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.util.Map;
+
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClientBuilder;
+
+public class CwComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public CwComponentVerifierExtension() {
+        this("aws2-cw");
+    }
+
+    public CwComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS).error(ResultErrorHelper.requiresOption("accessKey", parameters))
+            .error(ResultErrorHelper.requiresOption("secretKey", parameters)).error(ResultErrorHelper.requiresOption("region", parameters));
+
+        // Validate using the catalog
+
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+
+        try {
+            CwConfiguration configuration = setProperties(new CwConfiguration(), parameters);
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            CloudWatchClientBuilder clientBuilder = CloudWatchClient.builder();
+            CloudWatchClient client = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred)).region(Region.of(configuration.getRegion())).build();
+            client.listMetrics();
+        } catch (AwsServiceException e) {
+            ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                .detail("aws_cw_exception_message", e.getMessage()).detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+}
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java
new file mode 100644
index 0000000..c72b51a
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConfiguration.java
@@ -0,0 +1,203 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.time.Instant;
+import java.util.Date;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+
+@UriParams
+public class CwConfiguration implements Cloneable {
+
+    @UriPath @Metadata(required = true)
+    private String namespace;
+    @UriParam
+    private CloudWatchClient amazonCwClient;
+    @UriParam(label = "security", secret = true)
+    private String accessKey;
+    @UriParam(label = "security", secret = true)
+    private String secretKey;
+    @UriParam
+    private String name;
+    @UriParam
+    private Double value;
+    @UriParam
+    private String unit;
+    @UriParam
+    private Instant timestamp;
+    @UriParam(enums = "HTTP,HTTPS", defaultValue = "HTTPS")
+    private Protocol proxyProtocol = Protocol.HTTPS;
+    @UriParam
+    private String proxyHost;
+    @UriParam
+    private Integer proxyPort;
+    @UriParam
+    private String region;
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * The metric name
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    /**
+     * The metric value
+     */
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    /**
+     * The metric unit
+     */
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * The metric namespace
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    /**
+     * The metric timestamp
+     */
+    public void setTimestamp(Instant timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    public CloudWatchClient getAmazonCwClient() {
+        return amazonCwClient;
+    }
+
+    /**
+     * To use the AmazonCloudWatch as the client
+     */
+    public void setAmazonCwClient(CloudWatchClient amazonCwClient) {
+        this.amazonCwClient = amazonCwClient;
+    }
+    
+    public Protocol getProxyProtocol() {
+        return proxyProtocol;
+    }
+
+    /**
+     * To define a proxy protocol when instantiating the CW client
+     */
+    public void setProxyProtocol(Protocol proxyProtocol) {
+        this.proxyProtocol = proxyProtocol;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    /**
+     * To define a proxy host when instantiating the CW client
+     */
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * To define a proxy port when instantiating the CW client
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * The region in which CW client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1)
+     * You'll need to use the name Regions.EU_WEST_1.name()
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    // *************************************************
+    //
+    // *************************************************
+
+    public CwConfiguration copy() {
+        try {
+            return (CwConfiguration)super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+}
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java
new file mode 100644
index 0000000..09d7bcc
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwConstants.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+/**
+ * Constants used in Camel AWS CW module
+ */
+public interface CwConstants {
+    String METRIC_NAMESPACE = "CamelAwsCwMetricNamespace";
+    String METRIC_NAME = "CamelAwsCwMetricName";
+    String METRIC_VALUE = "CamelAwsCwMetricValue";
+    String METRIC_UNIT = "CamelAwsCwMetricUnit";
+    String METRIC_TIMESTAMP = "CamelAwsCwMetricTimestamp";
+    String METRIC_DIMENSIONS = "CamelAwsCwMetricDimensions";
+    String METRIC_DIMENSION_NAME = "CamelAwsCwMetricDimensionName";
+    String METRIC_DIMENSION_VALUE = "CamelAwsCwMetricDimensionValue";
+}
\ No newline at end of file
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java
new file mode 100644
index 0000000..8e88012
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwEndpoint.java
@@ -0,0 +1,127 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.net.URI;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClientBuilder;
+
+/**
+ * The aws-cw component is used for sending metrics to an Amazon CloudWatch.
+ */
+@UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-cw", title = "AWS 2 CloudWatch", syntax = "aws2-cw:namespace", producerOnly = true, label = "cloud,monitoring")
+public class CwEndpoint extends DefaultEndpoint {
+
+    @UriParam
+    private CwConfiguration configuration;
+    private CloudWatchClient cloudWatchClient;
+
+    public CwEndpoint(String uri, Component component, CwConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new CwProducer(this);
+    }
+
+    @Override
+    public void doInit() throws Exception {
+        super.doInit();
+
+        cloudWatchClient = configuration.getAmazonCwClient() != null ? configuration.getAmazonCwClient() : createCloudWatchClient();
+    }
+    
+    @Override
+    public void doStop() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getAmazonCwClient())) {
+            if (cloudWatchClient != null) {
+                cloudWatchClient.close();
+            }
+        }
+        super.doStop();
+    }
+
+    public CwConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(CwConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public void setCloudWatchClient(CloudWatchClient cloudWatchClient) {
+        this.cloudWatchClient = cloudWatchClient;
+    }
+
+    public CloudWatchClient getCloudWatchClient() {
+        return cloudWatchClient;
+    }
+
+    CloudWatchClient createCloudWatchClient() {
+        CloudWatchClient client = null;
+        CloudWatchClientBuilder clientBuilder = CloudWatchClient.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + configuration.getProxyHost() + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && configuration.getSecretKey() != null) {
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            if (isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder).credentialsProvider(StaticCredentialsProvider.create(cred));
+            } else {
+                clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
+            }
+        } else {
+            if (!isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java
new file mode 100644
index 0000000..72fe64a
--- /dev/null
+++ b/components/camel-aws2-cw/src/main/java/org/apache/camel/component/aws/cw/CwProducer.java
@@ -0,0 +1,157 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import software.amazon.awssdk.services.cloudwatch.model.Dimension;
+import software.amazon.awssdk.services.cloudwatch.model.MetricDatum;
+import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataRequest;
+import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;
+
+/**
+ * A Producer which sends messages to the AWS CloudWatch Service
+ */
+public class CwProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CwProducer.class);
+
+    private transient String cwProducerToString;
+    
+    public CwProducer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        List<MetricDatum> metricData = getMetricData(exchange);
+
+        PutMetricDataRequest.Builder builder = PutMetricDataRequest.builder();
+                builder.metricData(metricData).namespace(determineNameSpace(exchange));
+
+        PutMetricDataRequest request = builder.build();
+        LOG.info("Sending request [{}] from exchange [{}]...", request, exchange);
+        getEndpoint().getCloudWatchClient().putMetricData(request);
+    }
+
+    private List<MetricDatum> getMetricData(Exchange exchange) {
+        Object body = exchange.getIn().getBody();
+        if (body instanceof List) {
+            return CastUtils.cast((List<?>) body);
+        }
+
+        if (body instanceof MetricDatum) {
+            return Arrays.asList((MetricDatum) body);
+        }
+
+        MetricDatum.Builder metricDatum = MetricDatum.builder()
+                .metricName(determineName(exchange))
+                .value(determineValue(exchange))
+                .unit(determineUnit(exchange))
+                .timestamp(determineTimestamp(exchange));
+        setDimension(metricDatum, exchange);
+        return Arrays.asList(metricDatum.build());
+    }
+
+    private void setDimension(MetricDatum.Builder metricDatum, Exchange exchange) {
+        String name = exchange.getIn().getHeader(CwConstants.METRIC_DIMENSION_NAME, String.class);
+        String value = exchange.getIn().getHeader(CwConstants.METRIC_DIMENSION_VALUE, String.class);
+        if (name != null && value != null) {
+            metricDatum.dimensions(Dimension.builder().name(name).value(value).build());
+        } else {
+            Map<String, String> dimensions = exchange.getIn().getHeader(CwConstants.METRIC_DIMENSIONS, Map.class);
+            if (dimensions != null) {
+                Collection<Dimension> dimensionCollection = new ArrayList<>();
+                for (Map.Entry<String, String> dimensionEntry : dimensions.entrySet()) {
+                    Dimension dimension = Dimension.builder().name(dimensionEntry.getKey()).value(dimensionEntry.getValue()).build();
+                    dimensionCollection.add(dimension);
+                }
+                metricDatum.dimensions(dimensionCollection);
+            }
+        }
+    }
+
+    private Instant determineTimestamp(Exchange exchange) {
+        Instant timestamp = exchange.getIn().getHeader(CwConstants.METRIC_TIMESTAMP, Instant.class);
+        if (timestamp == null) {
+            timestamp = getConfiguration().getTimestamp();
+        }
+        return timestamp;
+    }
+
+    private String determineNameSpace(Exchange exchange) {
+        String namespace = exchange.getIn().getHeader(CwConstants.METRIC_NAMESPACE, String.class);
+        if (namespace == null) {
+            namespace = getConfiguration().getNamespace();
+        }
+        return namespace;
+    }
+
+    private String determineName(Exchange exchange) {
+        String name = exchange.getIn().getHeader(CwConstants.METRIC_NAME, String.class);
+        if (name == null) {
+            name = getConfiguration().getName();
+        }
+        return name;
+    }
+
+    private Double determineValue(Exchange exchange) {
+        Double value = exchange.getIn().getHeader(CwConstants.METRIC_VALUE, Double.class);
+        if (value == null) {
+            value = getConfiguration().getValue();
+        }
+        return value != null ? value : Double.valueOf(1);
+    }
+
+    private StandardUnit determineUnit(Exchange exchange) {
+        String unit = exchange.getIn().getHeader(CwConstants.METRIC_UNIT, String.class);
+        if (unit == null) {
+            unit = getConfiguration().getUnit();
+        }
+        return unit != null ? StandardUnit.fromValue(unit) : StandardUnit.COUNT;
+    }
+
+    protected CwConfiguration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        if (cwProducerToString == null) {
+            cwProducerToString = "CwProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return cwProducerToString;
+    }
+
+    @Override
+    public CwEndpoint getEndpoint() {
+        return (CwEndpoint) super.getEndpoint();
+    }
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CloudWatchClientMock.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CloudWatchClientMock.java
new file mode 100644
index 0000000..aefa813
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CloudWatchClientMock.java
@@ -0,0 +1,27 @@
+package org.apache.camel.component.aws.cw;
+
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataRequest;
+import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataResponse;
+
+public class CloudWatchClientMock implements CloudWatchClient {
+
+	@Override
+	public String serviceName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	@Override
+	public PutMetricDataResponse putMetricData(PutMetricDataRequest request)  {
+		PutMetricDataResponse.Builder builder = PutMetricDataResponse.builder();
+		return builder.build();
+	}
+
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java
new file mode 100644
index 0000000..1d92466
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentConfigurationTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.time.Instant;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+
+import static org.mockito.Mockito.mock;
+
+public class CwComponentConfigurationTest extends CamelTestSupport {
+    
+    @BindToRegistry("now")
+    private static final Instant NOW = Instant.now();
+
+    @Test
+    public void createEndpointWithAllOptions() throws Exception {
+        CloudWatchClient cloudWatchClient = mock(CloudWatchClient.class);
+        context.getRegistry().bind("amazonCwClient", cloudWatchClient);
+        CwComponent component = context.getComponent("aws-cw", CwComponent.class);
+        CwEndpoint endpoint = (CwEndpoint) component.createEndpoint("aws2-cw://camel.apache.org/test?amazonCwClient=#amazonCwClient&name=testMetric&value=2&unit=Count&timestamp=#now");
+
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("testMetric", endpoint.getConfiguration().getName());
+        assertEquals(Double.valueOf(2), endpoint.getConfiguration().getValue());
+        assertEquals("Count", endpoint.getConfiguration().getUnit());
+        assertEquals(NOW, endpoint.getConfiguration().getTimestamp());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAccessKeyConfiguration() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.createEndpoint("aws2-cw://camel.apache.org/test?secretKey=yyy");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSecretKeyConfiguration() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.createEndpoint("aws2-cw://camel.apache.org/test?accessKey=xxx");
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSecretKeyAndAccessKeyConfiguration() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.createEndpoint("aws2-cw://camel.apache.org/test?accessKey=xxx");
+    }
+    
+    @Test
+    public void createEndpointWithComponentElements() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        CwEndpoint endpoint = (CwEndpoint)component.createEndpoint("aws2-cw://camel.apache.org/test");
+        
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
+        assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
+    }
+    
+    @Test
+    public void createEndpointWithComponentAndEndpointElements() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.toString());
+        CwEndpoint endpoint = (CwEndpoint)component.createEndpoint("aws2-cw://camel.apache.org/test?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+        
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+    }
+    
+    @Test
+    public void createEndpointWithComponentEndpointOptionsAndProxy() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.id());
+        CwEndpoint endpoint = (CwEndpoint)component.createEndpoint("aws2-cw://camel.apache.org/test?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000");
+        
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+        assertEquals("localhost", endpoint.getConfiguration().getProxyHost());
+        assertEquals(new Integer(9000), endpoint.getConfiguration().getProxyPort());
+        assertEquals(Protocol.HTTPS, endpoint.getConfiguration().getProxyProtocol());
+    }
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentRegistryClientTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentRegistryClientTest.java
new file mode 100644
index 0000000..7e7348f
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentRegistryClientTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.time.Instant;
+import java.util.Date;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+
+import static org.mockito.Mockito.mock;
+
+public class CwComponentRegistryClientTest extends CamelTestSupport {
+    
+    @BindToRegistry("now")
+    private static final Instant NOW = Instant.now();
+
+    @Test
+    public void createEndpointWithAllOptions() throws Exception {
+        CloudWatchClient cloudWatchClient = mock(CloudWatchClient.class);
+        context.getRegistry().bind("amazonCwClient", cloudWatchClient);
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        CwEndpoint endpoint = (CwEndpoint) component.createEndpoint("aws2-cw://camel.apache.org/test?name=testMetric&value=2&unit=Count&timestamp=#now");
+
+        assertEquals("camel.apache.org/test", endpoint.getConfiguration().getNamespace());
+        assertEquals("testMetric", endpoint.getConfiguration().getName());
+        assertEquals(Double.valueOf(2), endpoint.getConfiguration().getValue());
+        assertEquals("Count", endpoint.getConfiguration().getUnit());
+        assertEquals(NOW, endpoint.getConfiguration().getTimestamp());
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithMinimalS3ClientMisconfiguration() throws Exception {
+        CwComponent component = context.getComponent("aws2-cw", CwComponent.class);
+        CwEndpoint endpoint = (CwEndpoint)component.createEndpoint("aws2-cw://camel.apache.org/test");
+    }
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java
new file mode 100644
index 0000000..6f2277b
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.time.Instant;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;
+import software.amazon.awssdk.services.cloudwatch.model.Dimension;
+import software.amazon.awssdk.services.cloudwatch.model.MetricDatum;
+import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataRequest;
+import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataResponse;
+import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;
+
+public class CwComponentTest extends CamelTestSupport {
+
+    @BindToRegistry("now")
+    private static final Instant NOW = Instant.now();
+
+    private static final Instant LATER = Instant.ofEpochMilli(NOW.getNano() + 1);
+
+    @BindToRegistry("amazonCwClient")
+    private CloudWatchClient cloudWatchClient = new CloudWatchClientMock();
+    
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void sendMetricFromHeaderValues() throws Exception {
+    	mock.expectedMessageCount(1);
+    	Exchange exchange = template.request("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(CwConstants.METRIC_NAMESPACE, "camel.apache.org/overriden");
+                exchange.getIn().setHeader(CwConstants.METRIC_NAME, "OverridenMetric");
+                exchange.getIn().setHeader(CwConstants.METRIC_VALUE, Double.valueOf(3));
+                exchange.getIn().setHeader(CwConstants.METRIC_UNIT, StandardUnit.BYTES.toString());
+                exchange.getIn().setHeader(CwConstants.METRIC_TIMESTAMP, LATER);
+            }
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("aws2-cw://camel.apache.org/test?amazonCwClient=#amazonCwClient&name=testMetric&unit=BYTES&timestamp=#now").to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtensionTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtensionTest.java
new file mode 100644
index 0000000..d01190a
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/CwComponentVerifierExtensionTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CwComponentVerifierExtensionTest extends CamelTestSupport {
+
+    // *************************************************
+    // Tests (parameters)
+    // *************************************************
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testParameters() throws Exception {
+        Component component = context().getComponent("aws-cw");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("namespace", "test");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivity() throws Exception {
+        Component component = context().getComponent("aws-cw");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "US_EAST_1");
+        parameters.put("namespace", "test");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+
+}
diff --git a/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java
new file mode 100644
index 0000000..755bed0
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/java/org/apache/camel/component/aws/cw/integration/CwComponentIntegrationTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.aws.cw.integration;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws.cw.CwConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore("Must be manually tested. Provide your own accessKey and secretKey!")
+public class CwComponentIntegrationTest extends CamelTestSupport {
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void sendInOnly() throws Exception {
+        mock.expectedMessageCount(1);
+
+        template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(CwConstants.METRIC_NAME, "ExchangesCompleted");
+                exchange.getIn().setHeader(CwConstants.METRIC_VALUE, "2.0");
+                exchange.getIn().setHeader(CwConstants.METRIC_UNIT, "Count");
+            }
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("aws2-cw://http://camel.apache.org/aws-cw?accessKey=XXX&secretKey=XXX")
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-cw/src/test/resources/log4j2.properties b/components/camel-aws2-cw/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..290d33e
--- /dev/null
+++ b/components/camel-aws2-cw/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-aws-cw-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/core/camel-componentdsl/pom.xml b/core/camel-componentdsl/pom.xml
index f70c4a1..ea5ffe6 100644
--- a/core/camel-componentdsl/pom.xml
+++ b/core/camel-componentdsl/pom.xml
@@ -238,6 +238,12 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-aws2-cw</artifactId>
+			<scope>provided</scope>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-aws2-ecs</artifactId>
 			<scope>provided</scope>
 			<version>${project.version}</version>
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 318a20d..5cd0dc1 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -461,6 +461,17 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.AwsTranslateComponentBuilderFactory.awsTranslate();
     }
     /**
+     * AWS 2 CloudWatch (camel-aws2-cw)
+     * The aws-cw component is used for sending metrics to an Amazon CloudWatch.
+     * 
+     * Category: cloud,monitoring
+     * Since: 3.1
+     * Maven coordinates: org.apache.camel:camel-aws2-cw
+     */
+    static org.apache.camel.builder.component.dsl.Aws2CwComponentBuilderFactory.Aws2CwComponentBuilder aws2Cw() {
+        return org.apache.camel.builder.component.dsl.Aws2CwComponentBuilderFactory.aws2Cw();
+    }
+    /**
      * AWS 2 ECS (camel-aws2-ecs)
      * The aws2-ecs is used for managing Amazon ECS
      * 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2CwComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2CwComponentBuilderFactory.java
new file mode 100644
index 0000000..6da7ebf
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2CwComponentBuilderFactory.java
@@ -0,0 +1,157 @@
+/*
+ * 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.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.aws.cw.CwComponent;
+
+/**
+ * The aws-cw component is used for sending metrics to an Amazon CloudWatch.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface Aws2CwComponentBuilderFactory {
+
+    /**
+     * AWS 2 CloudWatch (camel-aws2-cw)
+     * The aws-cw component is used for sending metrics to an Amazon CloudWatch.
+     * 
+     * Category: cloud,monitoring
+     * Since: 3.1
+     * Maven coordinates: org.apache.camel:camel-aws2-cw
+     */
+    static Aws2CwComponentBuilder aws2Cw() {
+        return new Aws2CwComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the AWS 2 CloudWatch component.
+     */
+    interface Aws2CwComponentBuilder extends ComponentBuilder<CwComponent> {
+        /**
+         * The AWS CW default configuration.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.aws.cw.CwConfiguration</code> type.
+         * 
+         * Group: advanced
+         */
+        default Aws2CwComponentBuilder configuration(
+                org.apache.camel.component.aws.cw.CwConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2CwComponentBuilder accessKey(java.lang.String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2CwComponentBuilder secretKey(java.lang.String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+        /**
+         * The region in which CW client needs to work.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2CwComponentBuilder region(java.lang.String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default Aws2CwComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default Aws2CwComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+    }
+
+    class Aws2CwComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<CwComponent>
+            implements
+                Aws2CwComponentBuilder {
+        @Override
+        protected CwComponent buildConcreteComponent() {
+            return new CwComponent();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "configuration": ((CwComponent) component).setConfiguration((org.apache.camel.component.aws.cw.CwConfiguration) value); return true;
+            case "accessKey": ((CwComponent) component).setAccessKey((java.lang.String) value); return true;
+            case "secretKey": ((CwComponent) component).setSecretKey((java.lang.String) value); return true;
+            case "region": ((CwComponent) component).setRegion((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((CwComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            case "lazyStartProducer": ((CwComponent) component).setLazyStartProducer((boolean) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index bcd48de..7fe7905 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -361,6 +361,26 @@
     "artifactId": "camel-avro",
     "version": "3.1.0-SNAPSHOT"
   },
+  "Aws2CwComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "aws2-cw",
+    "extendsScheme": "",
+    "syntax": "aws2-cw:namespace",
+    "title": "AWS 2 CloudWatch",
+    "description": "The aws-cw component is used for sending metrics to an Amazon CloudWatch.",
+    "label": "cloud,monitoring",
+    "deprecated": false,
+    "deprecationNote": "cloud,monitoring",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws.cw.CwComponent",
+    "firstVersion": "3.1.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-cw",
+    "version": "3.1.0-SNAPSHOT"
+  },
   "Aws2EcsComponentBuilderFactory": {
     "kind": "component",
     "scheme": "aws2-ecs",