You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2020/01/22 15:59:09 UTC

[camel-k] 13/13: chore(trait): Use container args to configure Prometheus agent

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

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

commit 4c5c9633c39083de8b5dec9dd291340a69d12a9d
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Wed Jan 22 15:53:55 2020 +0100

    chore(trait): Use container args to configure Prometheus agent
---
 deploy/prometheus-jmx-exporter.yaml            | 586 +++++++++++++++++++++
 deploy/resources.go                            | 673 +++++++++++++++++++++++--
 docs/modules/ROOT/pages/traits/prometheus.adoc |   9 +-
 pkg/apis/camel/v1/integration_types_support.go |  20 +
 pkg/trait/prometheus.go                        |  83 ++-
 pkg/trait/prometheus_test.go                   |  26 +-
 6 files changed, 1312 insertions(+), 85 deletions(-)

diff --git a/deploy/prometheus-jmx-exporter.yaml b/deploy/prometheus-jmx-exporter.yaml
new file mode 100644
index 0000000..aff0fc9
--- /dev/null
+++ b/deploy/prometheus-jmx-exporter.yaml
@@ -0,0 +1,586 @@
+startDelaySecs: 5
+ssl: false
+blacklistObjectNames: ["java.lang:*"]
+rules:
+  # Context level
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      type: context
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      type: context
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=consumers, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+
+
+  # Route level
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+
+  # Processor level
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+
+  # Consumers
+  - pattern: 'org.apache.camel<context=([^,]+), type=consumers, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      consumer: $2
+      type: consumers
+    type: GAUGE
+
+  # Services
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MaxDuration'
+    name: org.apache.camel.MaxDuration
+    help: Maximum Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MeanDuration'
+    name: org.apache.camel.MeanDuration
+    help: Mean Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MinDuration'
+    name: org.apache.camel.MinDuration
+    help: Minimum Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>TotalDuration'
+    name: org.apache.camel.TotalDuration
+    help: Total Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>ThreadsBlocked'
+    name: org.apache.camel.ThreadsBlocked
+    help: Threads Blocked
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>ThreadsInterrupted'
+    name: org.apache.camel.ThreadsInterrupted
+    help: Threads Interrupted
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumLogicalRuntimeFaults'
+    name: org.apache.cxf.NumLogicalRuntimeFaults
+    help: Number of logical runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumLogicalRuntimeFaults'
+    name: org.apache.cxf.NumLogicalRuntimeFaults
+    help: Number of logical runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>AvgResponseTime'
+    name: org.apache.cxf.AvgResponseTime
+    help: Average Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>AvgResponseTime'
+    name: org.apache.cxf.AvgResponseTime
+    help: Average Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumInvocations'
+    name: org.apache.cxf.NumInvocations
+    help: Number of invocations
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumInvocations'
+    name: org.apache.cxf.NumInvocations
+    help: Number of invocations
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MaxResponseTime'
+    name: org.apache.cxf.MaxResponseTime
+    help: Maximum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>MaxResponseTime'
+    name: org.apache.cxf.MaxResponseTime
+    help: Maximum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MinResponseTime'
+    name: org.apache.cxf.MinResponseTime
+    help: Minimum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MinResponseTime'
+    name: org.apache.cxf.MinResponseTime
+    help: Minimum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>TotalHandlingTime'
+    name: org.apache.cxf.TotalHandlingTime
+    help: Total Handling Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>TotalHandlingTime'
+    name: org.apache.cxf.TotalHandlingTime
+    help: Total Handling Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumRuntimeFaults'
+    name: org.apache.cxf.NumRuntimeFaults
+    help: Number of runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumRuntimeFaults'
+    name: org.apache.cxf.NumRuntimeFaults
+    help: Number of runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumUnCheckedApplicationFaults'
+    name: org.apache.cxf.NumUnCheckedApplicationFaults
+    help: Number of unchecked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumUnCheckedApplicationFaults'
+    name: org.apache.cxf.NumUnCheckedApplicationFaults
+    help: Number of unchecked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumCheckedApplicationFaults'
+    name: org.apache.cxf.NumCheckedApplicationFaults
+    help: Number of checked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumCheckedApplicationFaults'
+    name: org.apache.cxf.NumCheckedApplicationFaults
+    help: Number of checked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
\ No newline at end of file
diff --git a/deploy/resources.go b/deploy/resources.go
index 60513dc..04dc010 100644
--- a/deploy/resources.go
+++ b/deploy/resources.go
@@ -19,8 +19,6 @@ limitations under the License.
 
 package deploy
 
-var Resources map[string]string
-
 func init() {
 	Resources = make(map[string]string)
 
@@ -7971,6 +7969,46 @@ spec:
       - org.apache.camel.dataformat.zipfile.ZipFileDataFormat
 
 `
+	Resources["cr-example.yaml"] =
+		`
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ---------------------------------------------------------------------------
+
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: example
+spec:
+  sources:
+  - content: |-
+      // This is Camel K Groovy example route
+
+      rnd = new Random()
+
+      from('timer:groovy?period=1s')
+          .routeId('groovy')
+          .setBody()
+              .constant('Hello Camel K!')
+          .process {
+              it.in.headers['RandomValue'] = rnd.nextInt()
+          }
+          .to('log:info?showHeaders=true')
+    name: routes.groovy
+`
 	Resources["crd-build.yaml"] =
 		`
 # ---------------------------------------------------------------------------
@@ -8272,46 +8310,6 @@ spec:
       JSONPath: .status.replicas
 
 `
-	Resources["cr-example.yaml"] =
-		`
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-apiVersion: camel.apache.org/v1
-kind: Integration
-metadata:
-  name: example
-spec:
-  sources:
-  - content: |-
-      // This is Camel K Groovy example route
-
-      rnd = new Random()
-
-      from('timer:groovy?period=1s')
-          .routeId('groovy')
-          .setBody()
-              .constant('Hello Camel K!')
-          .process {
-              it.in.headers['RandomValue'] = rnd.nextInt()
-          }
-          .to('log:info?showHeaders=true')
-    name: routes.groovy
-`
 	Resources["operator-deployment.yaml"] =
 		`
 # ---------------------------------------------------------------------------
@@ -9338,6 +9336,595 @@ spec:
     - mvn:org.apache.camel.k/camel-k-runtime-main
     - mvn:org.apache.camel.k/camel-k-loader-yaml
 `
+	Resources["prometheus-jmx-exporter.yaml"] =
+		`
+startDelaySecs: 5
+ssl: false
+blacklistObjectNames: ["java.lang:*"]
+rules:
+  # Context level
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      type: context
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      type: context
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      type: context
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=context, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=consumers, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      type: context
+    type: GAUGE
+
+
+  # Route level
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      route: $2
+      type: routes
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=routes, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      route: $2
+      type: routes
+    type: GAUGE
+
+  # Processor level
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesCompleted'
+    name: org.apache.camel.ExchangesCompleted
+    help: Exchanges Completed
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesFailed'
+    name: org.apache.camel.ExchangesFailed
+    help: Exchanges Failed
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesInflight'
+    name: org.apache.camel.ExchangesInflight
+    help: Exchanges Inflight
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExchangesTotal'
+    name: org.apache.camel.ExchangesTotal
+    help: Exchanges Total
+    type: COUNTER
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>FailuresHandled'
+    name: org.apache.camel.FailuresHandled
+    help: Failures Handled
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>ExternalRedeliveries'
+    name: org.apache.camel.ExternalRedeliveries
+    help: External Redeliveries
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MaxProcessingTime'
+    name: org.apache.camel.MaxProcessingTime
+    help: Maximum Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MeanProcessingTime'
+    name: org.apache.camel.MeanProcessingTime
+    help: Mean Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>MinProcessingTime'
+    name: org.apache.camel.MinProcessingTime
+    help: Minimum Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>LastProcessingTime'
+    name: org.apache.camel.LastProcessingTime
+    help: Last Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>DeltaProcessingTime'
+    name: org.apache.camel.DeltaProcessingTime
+    help: Delta Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>Redeliveries'
+    name: org.apache.camel.Redeliveries
+    help: Redeliveries
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>TotalProcessingTime'
+    name: org.apache.camel.TotalProcessingTime
+    help: Total Processing Time
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=processors, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      processor: $2
+      type: processors
+    type: COUNTER
+
+  # Consumers
+  - pattern: 'org.apache.camel<context=([^,]+), type=consumers, name="([^"]+)"><>InflightExchanges'
+    name: org.apache.camel.InflightExchanges
+    help: Inflight Exchanges
+    labels:
+      context: $1
+      consumer: $2
+      type: consumers
+    type: GAUGE
+
+  # Services
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MaxDuration'
+    name: org.apache.camel.MaxDuration
+    help: Maximum Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MeanDuration'
+    name: org.apache.camel.MeanDuration
+    help: Mean Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>MinDuration'
+    name: org.apache.camel.MinDuration
+    help: Minimum Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>TotalDuration'
+    name: org.apache.camel.TotalDuration
+    help: Total Duration
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>ThreadsBlocked'
+    name: org.apache.camel.ThreadsBlocked
+    help: Threads Blocked
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.camel<context=([^,]+), type=services, name="([^"]+)"><>ThreadsInterrupted'
+    name: org.apache.camel.ThreadsInterrupted
+    help: Threads Interrupted
+    labels:
+      context: $1
+      service: $2
+      type: services
+    type: GAUGE
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumLogicalRuntimeFaults'
+    name: org.apache.cxf.NumLogicalRuntimeFaults
+    help: Number of logical runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumLogicalRuntimeFaults'
+    name: org.apache.cxf.NumLogicalRuntimeFaults
+    help: Number of logical runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>AvgResponseTime'
+    name: org.apache.cxf.AvgResponseTime
+    help: Average Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>AvgResponseTime'
+    name: org.apache.cxf.AvgResponseTime
+    help: Average Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumInvocations'
+    name: org.apache.cxf.NumInvocations
+    help: Number of invocations
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumInvocations'
+    name: org.apache.cxf.NumInvocations
+    help: Number of invocations
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MaxResponseTime'
+    name: org.apache.cxf.MaxResponseTime
+    help: Maximum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>MaxResponseTime'
+    name: org.apache.cxf.MaxResponseTime
+    help: Maximum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MinResponseTime'
+    name: org.apache.cxf.MinResponseTime
+    help: Minimum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>MinResponseTime'
+    name: org.apache.cxf.MinResponseTime
+    help: Minimum Response Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>TotalHandlingTime'
+    name: org.apache.cxf.TotalHandlingTime
+    help: Total Handling Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>TotalHandlingTime'
+    name: org.apache.cxf.TotalHandlingTime
+    help: Total Handling Time
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumRuntimeFaults'
+    name: org.apache.cxf.NumRuntimeFaults
+    help: Number of runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumRuntimeFaults'
+    name: org.apache.cxf.NumRuntimeFaults
+    help: Number of runtime faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumUnCheckedApplicationFaults'
+    name: org.apache.cxf.NumUnCheckedApplicationFaults
+    help: Number of unchecked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumUnCheckedApplicationFaults'
+    name: org.apache.cxf.NumUnCheckedApplicationFaults
+    help: Number of unchecked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+), operation=([^,]+)><>NumCheckedApplicationFaults'
+    name: org.apache.cxf.NumCheckedApplicationFaults
+    help: Number of checked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+      operation: $5
+  - pattern: 'org.apache.cxf<bus.id=([^,]+), type=([^,]+), service=([^,]+), port=([^,]+)><>NumCheckedApplicationFaults'
+    name: org.apache.cxf.NumCheckedApplicationFaults
+    help: Number of checked application faults
+    type: GAUGE
+    labels:
+      bus.id: $1
+      type: $2
+      service: $3
+      port: $4
+`
 	Resources["user-cluster-role.yaml"] =
 		`
 # ---------------------------------------------------------------------------
@@ -9374,3 +9961,5 @@ rules:
 `
 
 }
+
+var Resources map[string]string
diff --git a/docs/modules/ROOT/pages/traits/prometheus.adoc b/docs/modules/ROOT/pages/traits/prometheus.adoc
index f358769..ea5dfaf 100755
--- a/docs/modules/ROOT/pages/traits/prometheus.adoc
+++ b/docs/modules/ROOT/pages/traits/prometheus.adoc
@@ -1,12 +1,11 @@
 = Prometheus Trait
 
 // Start of autogenerated code - DO NOT EDIT! (description)
-The Prometheus trait exposes the integration with a `Service` and a `ServiceMonitor` resources
-so that the Prometheus endpoint can be scraped.
+The Prometheus trait configures the Prometheus JMX exporter and exposes the integration with a `Service`
+and a `ServiceMonitor` resources so that the Prometheus endpoint can be scraped.
 
-WARNING: Creating the `ServiceMonitor` resource requires the https://github.com/coreos/prometheus-operator[Prometheus Operator]
-custom resource definition to be installed. You can set `service-monitor` to `false` for the Prometheus trait to work without
-the Prometheus operator.
+WARNING: The creation of the `ServiceMonitor` resource requires the https://github.com/coreos/prometheus-operator[Prometheus Operator] custom resource definition to be installed.
+You can set `service-monitor` to `false` for the Prometheus trait to work without the Prometheus operator.
 
 It's disabled by default.
 
diff --git a/pkg/apis/camel/v1/integration_types_support.go b/pkg/apis/camel/v1/integration_types_support.go
index 2b2e61f..21b8c0e 100644
--- a/pkg/apis/camel/v1/integration_types_support.go
+++ b/pkg/apis/camel/v1/integration_types_support.go
@@ -108,6 +108,26 @@ func (in *IntegrationSpec) AddDependency(dependency string) {
 	in.Dependencies = append(in.Dependencies, newDep)
 }
 
+// AddOrReplaceGeneratedResources --
+func (in *IntegrationStatus) AddOrReplaceGeneratedResources(resources ...ResourceSpec) {
+	newResources := make([]ResourceSpec, 0)
+	for _, resource := range resources {
+		replaced := false
+		for i, r := range in.GeneratedResources {
+			if r.Name == resource.Name {
+				in.GeneratedResources[i] = resource
+				replaced = true
+				break
+			}
+		}
+		if !replaced {
+			newResources = append(newResources, resource)
+		}
+	}
+
+	in.GeneratedResources = append(in.GeneratedResources, newResources...)
+}
+
 // Configurations --
 func (in *IntegrationSpec) Configurations() []ConfigurationSpec {
 	if in == nil {
diff --git a/pkg/trait/prometheus.go b/pkg/trait/prometheus.go
index f489874..874829e 100644
--- a/pkg/trait/prometheus.go
+++ b/pkg/trait/prometheus.go
@@ -19,24 +19,27 @@ package trait
 
 import (
 	"fmt"
+	"path"
 	"strconv"
-
-	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/pkg/util/envvar"
+	"strings"
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 
 	monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
+
+	"github.com/apache/camel-k/deploy"
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/util"
 )
 
-// The Prometheus trait exposes the integration with a `Service` and a `ServiceMonitor` resources
-// so that the Prometheus endpoint can be scraped.
+// The Prometheus trait configures the Prometheus JMX exporter and exposes the integration with a `Service`
+// and a `ServiceMonitor` resources so that the Prometheus endpoint can be scraped.
 //
-// WARNING: Creating the `ServiceMonitor` resource requires the https://github.com/coreos/prometheus-operator[Prometheus Operator]
-// custom resource definition to be installed. You can set `service-monitor` to `false` for the Prometheus trait to work without
-// the Prometheus operator.
+// WARNING: The creation of the `ServiceMonitor` resource requires the https://github.com/coreos/prometheus-operator[Prometheus Operator]
+//custom resource definition to be installed.
+// You can set `service-monitor` to `false` for the Prometheus trait to work without the Prometheus operator.
 //
 // It's disabled by default.
 //
@@ -51,10 +54,12 @@ type prometheusTrait struct {
 	ServiceMonitorLabels string `property:"service-monitor-labels"`
 }
 
-const prometheusPortName = "prometheus"
+const (
+	prometheusJmxExporterConfigFileName  = "prometheus-jmx-exporter.yaml"
+	prometheusJmxExporterConfigMountPath = "/etc/prometheus"
+	prometheusPortName                   = "prometheus"
+)
 
-// The Prometheus trait must be executed prior to the deployment trait
-// as it mutates environment variables
 func newPrometheusTrait() *prometheusTrait {
 	return &prometheusTrait{
 		BaseTrait:      newBaseTrait("prometheus"),
@@ -64,10 +69,35 @@ func newPrometheusTrait() *prometheusTrait {
 }
 
 func (t *prometheusTrait) Configure(e *Environment) (bool, error) {
-	return e.IntegrationInPhase(v1.IntegrationPhaseDeploying, v1.IntegrationPhaseRunning), nil
+	return t.Enabled != nil && *t.Enabled && e.IntegrationInPhase(
+		v1.IntegrationPhaseInitialization,
+		v1.IntegrationPhaseDeploying,
+		v1.IntegrationPhaseRunning,
+	), nil
 }
 
 func (t *prometheusTrait) Apply(e *Environment) (err error) {
+	if e.IntegrationInPhase(v1.IntegrationPhaseInitialization) {
+		// Add the Camel management and Prometheus agent dependencies
+		util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, "mvn:org.apache.camel/camel-management")
+		// TODO: We may want to make the Prometheus version configurable
+		util.StringSliceUniqueAdd(&e.Integration.Status.Dependencies, "mvn:io.prometheus.jmx/jmx_prometheus_javaagent:0.3.1")
+
+		// Add the default Prometheus JMX exporter configuration
+		// TODO: Support user-provided configuration
+		configMap := t.getJmxExporterConfigMap(e)
+		e.Resources.Add(configMap)
+		e.Integration.Status.AddOrReplaceGeneratedResources(v1.ResourceSpec{
+			Type: v1.ResourceTypeData,
+			DataSpec: v1.DataSpec{
+				Name:       prometheusJmxExporterConfigFileName,
+				ContentRef: configMap.Name,
+			},
+			MountPath: prometheusJmxExporterConfigMountPath,
+		})
+		return nil
+	}
+
 	container := e.getIntegrationContainer()
 	if container == nil {
 		e.Integration.Status.SetCondition(
@@ -79,13 +109,6 @@ func (t *prometheusTrait) Apply(e *Environment) (err error) {
 		return nil
 	}
 
-	if t.Enabled == nil || !*t.Enabled {
-		// Deactivate the Prometheus Java agent
-		// Note: the AB_PROMETHEUS_OFF environment variable acts as an option flag
-		envvar.SetVal(&container.Env, "AB_PROMETHEUS_OFF", "true")
-		return nil
-	}
-
 	condition := v1.IntegrationCondition{
 		Type:   v1.IntegrationConditionPrometheusAvailable,
 		Status: corev1.ConditionTrue,
@@ -93,7 +116,8 @@ func (t *prometheusTrait) Apply(e *Environment) (err error) {
 	}
 
 	// Configure the Prometheus Java agent
-	envvar.SetVal(&container.Env, "AB_PROMETHEUS_PORT", strconv.Itoa(t.Port))
+	options := []string{strconv.Itoa(t.Port), path.Join(prometheusJmxExporterConfigMountPath, prometheusJmxExporterConfigFileName)}
+	container.Args = append(container.Args, "-javaagent:dependencies/io.prometheus.jmx.jmx_prometheus_javaagent-0.3.1.jar="+strings.Join(options, ":"))
 
 	// Add the container port
 	containerPort := t.getContainerPort()
@@ -191,3 +215,22 @@ func (t *prometheusTrait) getServiceMonitorFor(e *Environment) (*monitoringv1.Se
 	}
 	return &smt, nil
 }
+
+func (t *prometheusTrait) getJmxExporterConfigMap(e *Environment) *corev1.ConfigMap {
+	return &corev1.ConfigMap{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "ConfigMap",
+			APIVersion: "v1",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      e.Integration.Name + "-prometheus",
+			Namespace: e.Integration.Namespace,
+			Labels: map[string]string{
+				"camel.apache.org/integration": e.Integration.Name,
+			},
+		},
+		Data: map[string]string{
+			"content": deploy.Resources["prometheus-jmx-exporter.yaml"],
+		},
+	}
+}
diff --git a/pkg/trait/prometheus_test.go b/pkg/trait/prometheus_test.go
index f5f7ab0..144feb7 100644
--- a/pkg/trait/prometheus_test.go
+++ b/pkg/trait/prometheus_test.go
@@ -21,10 +21,6 @@ import (
 	"context"
 	"testing"
 
-	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/pkg/util/kubernetes"
-	"github.com/apache/camel-k/pkg/util/test"
-
 	"github.com/stretchr/testify/assert"
 
 	monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
@@ -32,6 +28,9 @@ import (
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
 )
 
 func TestConfigurePrometheusTraitInRightPhaseDoesSucceed(t *testing.T) {
@@ -62,7 +61,11 @@ func TestApplyNominalPrometheusTraitDoesSucceed(t *testing.T) {
 
 	container := environment.Resources.GetContainerByName(defaultContainerName)
 	assert.NotNil(t, container)
-	test.EnvVarHasValue(t, container.Env, "AB_PROMETHEUS_PORT", "9779")
+
+	assert.Equal(t, container.Args, []string{
+		"-javaagent:dependencies/io.prometheus.jmx.jmx_prometheus_javaagent-0.3.1.jar=9779:/etc/prometheus/prometheus-jmx-exporter.yaml",
+	})
+
 	ports := container.Ports
 	assert.Len(t, ports, 1)
 	assert.Equal(t, "prometheus", ports[0].Name)
@@ -147,19 +150,6 @@ func TestApplyPrometheusTraitWithServiceDoesNotSucceed(t *testing.T) {
 	assert.Equal(t, corev1.ConditionFalse, condition.Status)
 }
 
-func TestApplyDisabledPrometheusTraitShouldDeactivateJavaAgent(t *testing.T) {
-	trait, environment := createNominalPrometheusTest()
-	trait.Enabled = new(bool)
-
-	err := trait.Apply(environment)
-
-	assert.Nil(t, err)
-
-	container := environment.Resources.GetContainerByName(defaultContainerName)
-	assert.NotNil(t, container)
-	test.EnvVarHasValue(t, container.Env, "AB_PROMETHEUS_OFF", "true")
-}
-
 func TestPrometheusTraitGetServiceMonitor(t *testing.T) {
 	trait, environment := createNominalPrometheusTest()