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

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

commit 994822d973d3ab3b2d0dd79eb2e501deab750f05
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Tue Feb 17 12:51:24 2026 +0100

    feat: enable Camel Dashboard monitoring
    
    This change is required to include an operator env var which we can use to 
enable the monitoring from Camel Dashboard project
    
    Closes https://github.com/camel-tooling/camel-dashboard-operator/issues/90
---
 .../ROOT/pages/installation/advanced/advanced.adoc |  4 +++
 .../config/manager/operator-deployment.yaml        |  5 +++
 pkg/trait/cron.go                                  |  9 +++--
 pkg/trait/deployment.go                            |  9 +++--
 pkg/trait/deployment_test.go                       | 14 +++++++-
 pkg/trait/knative_service.go                       | 22 ++++++------
 pkg/util/kubernetes/labels.go                      | 41 ++++++++++++++++++++++
 7 files changed, 82 insertions(+), 22 deletions(-)

diff --git a/docs/modules/ROOT/pages/installation/advanced/advanced.adoc 
b/docs/modules/ROOT/pages/installation/advanced/advanced.adoc
index 4ee021a18..b648e9dba 100644
--- a/docs/modules/ROOT/pages/installation/advanced/advanced.adoc
+++ b/docs/modules/ROOT/pages/installation/advanced/advanced.adoc
@@ -67,6 +67,10 @@ The following environment variables can be configured on the 
operator Deployment
 |`false`
 |When set to `true`, enables synthetic Integration support for managing 
external workloads.
 
+|`CAMEL_DASHBOARD_APP_LABEL`
+|`camel.apache.org/app`
+|If it exists, the operator add this label beside regular Camel K labels in 
order to let the Camel Dashboard discover and monitor the application.
+
 |`LOG_LEVEL`
 |`info`
 |The log level for the operator. Valid values: `debug`, `info`, `warn`, 
`error`.
diff --git a/pkg/resources/config/manager/operator-deployment.yaml 
b/pkg/resources/config/manager/operator-deployment.yaml
index e95501896..470230b77 100644
--- a/pkg/resources/config/manager/operator-deployment.yaml
+++ b/pkg/resources/config/manager/operator-deployment.yaml
@@ -72,6 +72,11 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
+            # Used to automatically enable Camel Dashboard project monitoring
+            # Keep the default value or change it to the same label used by 
the dashboard
+            # Note: remove the variable to disable the feature.
+            - name: CAMEL_DASHBOARD_APP_LABEL
+              value: "camel.apache.org/app"
           livenessProbe:
             httpGet:
               path: /healthz
diff --git a/pkg/trait/cron.go b/pkg/trait/cron.go
index 7c87348c2..dc9088058 100644
--- a/pkg/trait/cron.go
+++ b/pkg/trait/cron.go
@@ -34,6 +34,7 @@ import (
        traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
        "github.com/apache/camel-k/v2/pkg/metadata"
        "github.com/apache/camel-k/v2/pkg/util"
+       "github.com/apache/camel-k/v2/pkg/util/kubernetes"
        "github.com/apache/camel-k/v2/pkg/util/source"
        "github.com/apache/camel-k/v2/pkg/util/uri"
 )
@@ -261,11 +262,9 @@ func (t *cronTrait) getCronJobFor(e *Environment) 
*batchv1.CronJob {
                        APIVersion: batchv1.SchemeGroupVersion.String(),
                },
                ObjectMeta: metav1.ObjectMeta{
-                       Name:      e.Integration.Name,
-                       Namespace: e.Integration.Namespace,
-                       Labels: map[string]string{
-                               v1.IntegrationLabel: e.Integration.Name,
-                       },
+                       Name:        e.Integration.Name,
+                       Namespace:   e.Integration.Namespace,
+                       Labels:      
kubernetes.DeploymentLabels(e.Integration.Name),
                        Annotations: e.Integration.Annotations,
                },
                Spec: batchv1.CronJobSpec{
diff --git a/pkg/trait/deployment.go b/pkg/trait/deployment.go
index 2c5ff764b..c4920f763 100644
--- a/pkg/trait/deployment.go
+++ b/pkg/trait/deployment.go
@@ -28,6 +28,7 @@ import (
 
        v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
        traitv1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait"
+       "github.com/apache/camel-k/v2/pkg/util/kubernetes"
 )
 
 const (
@@ -132,11 +133,9 @@ func (t *deploymentTrait) getDeploymentFor(e *Environment) 
*appsv1.Deployment {
                        APIVersion: appsv1.SchemeGroupVersion.String(),
                },
                ObjectMeta: metav1.ObjectMeta{
-                       Name:      e.Integration.Name,
-                       Namespace: e.Integration.Namespace,
-                       Labels: map[string]string{
-                               v1.IntegrationLabel: e.Integration.Name,
-                       },
+                       Name:        e.Integration.Name,
+                       Namespace:   e.Integration.Namespace,
+                       Labels:      
kubernetes.DeploymentLabels(e.Integration.Name),
                        Annotations: annotations,
                },
                Spec: appsv1.DeploymentSpec{
diff --git a/pkg/trait/deployment_test.go b/pkg/trait/deployment_test.go
index 1eb97fd63..a48740940 100644
--- a/pkg/trait/deployment_test.go
+++ b/pkg/trait/deployment_test.go
@@ -136,7 +136,7 @@ func TestApplyDeploymentTraitWithProgressDeadline(t 
*testing.T) {
        assert.Equal(t, int32(120), *deployment.Spec.ProgressDeadlineSeconds)
 }
 
-func TestApplyDeploymentTraitWitRecresteStrategy(t *testing.T) {
+func TestApplyDeploymentTraitWitRecreateStrategy(t *testing.T) {
        deploymentTrait, environment := createNominalDeploymentTest()
        maxSurge := intstr.FromInt(10)
 
@@ -323,3 +323,15 @@ func createNominalDeploymentTest() (*deploymentTrait, 
*Environment) {
 
        return trait, environment
 }
+
+func TestApplyDeploymentWithCamelDashboardLabel(t *testing.T) {
+       t.Setenv(kubernetes.CamelDashboardAppLabelEnvVar, "my-dashboard-label")
+
+       deploymentTrait, environment := createNominalDeploymentTest()
+       err := deploymentTrait.Apply(environment)
+       require.NoError(t, err)
+
+       deployment := environment.Resources.GetDeployment(func(deployment 
*appsv1.Deployment) bool { return true })
+       assert.NotNil(t, deployment)
+       assert.Equal(t, "integration-name", 
deployment.Labels["my-dashboard-label"])
+}
diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go
index 224f5b1cb..e0f1e88f9 100644
--- a/pkg/trait/knative_service.go
+++ b/pkg/trait/knative_service.go
@@ -33,6 +33,7 @@ import (
        "github.com/apache/camel-k/v2/pkg/metadata"
        "github.com/apache/camel-k/v2/pkg/util/boolean"
        "github.com/apache/camel-k/v2/pkg/util/knative"
+       "github.com/apache/camel-k/v2/pkg/util/kubernetes"
 )
 
 const (
@@ -209,17 +210,16 @@ func (t *knativeServiceTrait) getServiceFor(e 
*Environment) (*serving.Service, e
                revisionAnnotations[knativeServingMaxScaleAnnotation] = 
strconv.Itoa(*t.MaxScale)
        }
 
-       serviceLabels := map[string]string{
-               v1.IntegrationLabel: e.Integration.Name,
-               // Make sure the Eventing webhook will select the source 
resource,
-               // in order to inject the sink information.
-               // This is necessary for Knative environments, that are 
configured
-               // with SINK_BINDING_SELECTION_MODE=inclusion.
-               // See:
-               // - 
https://knative.dev/v1.3-docs/eventing/custom-event-source/sinkbinding/create-a-sinkbinding/#optional-choose-sinkbinding-namespace-selection-behavior
-               // - 
https://github.com/knative/operator/blob/release-1.2/docs/configuration.md#specsinkbindingselectionmode
-               "bindings.knative.dev/include": boolean.TrueString,
-       }
+       serviceLabels := kubernetes.DeploymentLabels(e.Integration.Name)
+       // Make sure the Eventing webhook will select the source resource,
+       // in order to inject the sink information.
+       // This is necessary for Knative environments, that are configured
+       // with SINK_BINDING_SELECTION_MODE=inclusion.
+       // See:
+       // - 
https://knative.dev/v1.3-docs/eventing/custom-event-source/sinkbinding/create-a-sinkbinding/#optional-choose-sinkbinding-namespace-selection-behavior
+       // - 
https://github.com/knative/operator/blob/release-1.2/docs/configuration.md#specsinkbindingselectionmode
+       serviceLabels["bindings.knative.dev/include"] = boolean.TrueString
+
        if t.Visibility != "" {
                serviceLabels[knativeServingVisibilityLabel] = t.Visibility
        }
diff --git a/pkg/util/kubernetes/labels.go b/pkg/util/kubernetes/labels.go
new file mode 100644
index 000000000..47fe3d213
--- /dev/null
+++ b/pkg/util/kubernetes/labels.go
@@ -0,0 +1,41 @@
+/*
+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 kubernetes
+
+import (
+       "os"
+
+       v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
+)
+
+const CamelDashboardAppLabelEnvVar = "CAMEL_DASHBOARD_APP_LABEL"
+
+// DeploymentLabels returns the fixed labels assigned to each Camel workload.
+func DeploymentLabels(integrationName string) map[string]string {
+       labels := map[string]string{
+               // Required by Camel K
+               v1.IntegrationLabel: integrationName,
+       }
+       camelDashboardLabel, ok := os.LookupEnv(CamelDashboardAppLabelEnvVar)
+       if ok && camelDashboardLabel != "" {
+               // Will automatically enable App discovery by Camel Dashboard
+               labels[camelDashboardLabel] = integrationName
+       }
+
+       return labels
+}

Reply via email to