From ac1814874321a41dba722e9b49ac403ce908e9c5 Mon Sep 17 00:00:00 2001 From: Eden Federman Date: Thu, 29 Jun 2023 14:47:11 +0300 Subject: [PATCH] Add support for changing reported application name (#265) This PR adds the ability to change the application name before delivering data to the chosen destination --- .goreleaser.yaml | 2 +- .../controllers/datacollection/daemonset.go | 3 +- autoscaler/controllers/gateway/deployment.go | 3 +- cli/cmd/resources/autoscaler.go | 20 +---- cli/cmd/resources/datacollection.go | 3 + cli/cmd/resources/instrumentor.go | 19 ---- cli/cmd/resources/scheduler.go | 20 +---- .../api/source/[namespace]/[kind]/[name].ts | 38 +++----- ui/pages/source/[namespace]/[kind]/[name].tsx | 86 +++++++++++++++---- 9 files changed, 89 insertions(+), 105 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index c33ac21af..42cb02853 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -3,7 +3,7 @@ project_name: odigos before: hooks: - - sh -c 'cd frontend/webapp && yarn build' + - sh -c 'cd frontend/webapp && yarn install && yarn build' builds: - env: - CGO_ENABLED=0 diff --git a/autoscaler/controllers/datacollection/daemonset.go b/autoscaler/controllers/datacollection/daemonset.go index ae010259e..3c4c1e665 100644 --- a/autoscaler/controllers/datacollection/daemonset.go +++ b/autoscaler/controllers/datacollection/daemonset.go @@ -3,6 +3,7 @@ package datacollection import ( "context" "fmt" + "github.com/keyval-dev/odigos/autoscaler/controllers/datacollection/custom" "k8s.io/apimachinery/pkg/util/intstr" @@ -21,7 +22,7 @@ import ( const ( collectorLabel = "odigos.io/data-collection" containerName = "data-collection" - containerImage = "keyval/otel-collector-contrib:v0.3" + containerImage = "keyval/otel-collector-contrib:v0.4" containerCommand = "/otelcontribcol" confDir = "/conf" configHashAnnotation = "odigos.io/config-hash" diff --git a/autoscaler/controllers/gateway/deployment.go b/autoscaler/controllers/gateway/deployment.go index 4a035e650..d7ed2c0a4 100644 --- a/autoscaler/controllers/gateway/deployment.go +++ b/autoscaler/controllers/gateway/deployment.go @@ -3,6 +3,7 @@ package gateway import ( "context" "fmt" + odigosv1 "github.com/keyval-dev/odigos/api/odigos/v1alpha1" "github.com/keyval-dev/odigos/autoscaler/controllers/common" appsv1 "k8s.io/api/apps/v1" @@ -18,7 +19,7 @@ import ( const ( containerName = "gateway" - containerImage = "keyval/otel-collector-contrib:v0.3" + containerImage = "keyval/otel-collector-contrib:v0.4" containerCommand = "/otelcontribcol" confDir = "/conf" configHashAnnotation = "odigos.io/config-hash" diff --git a/cli/cmd/resources/autoscaler.go b/cli/cmd/resources/autoscaler.go index c387aac35..d21c9280a 100644 --- a/cli/cmd/resources/autoscaler.go +++ b/cli/cmd/resources/autoscaler.go @@ -2,6 +2,7 @@ package resources import ( "fmt" + "github.com/keyval-dev/odigos/cli/pkg/labels" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -378,25 +379,6 @@ func NewAutoscalerDeployment(version string) *appsv1.Deployment { }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - { - Name: "apis-rbac-proxy", - Image: "gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0", - Args: []string{ - "--secure-listen-address=0.0.0.0:8443", - "--upstream=http://127.0.0.1:8080/", - "--logtostderr=true", - "--v=0", - }, - Ports: []corev1.ContainerPort{ - { - Name: "https", - HostPort: 0, - ContainerPort: 8443, - Protocol: "TCP", - }, - }, - Resources: corev1.ResourceRequirements{}, - }, { Name: "manager", Image: fmt.Sprintf("%s:%s", autoscalerImage, version), diff --git a/cli/cmd/resources/datacollection.go b/cli/cmd/resources/datacollection.go index 2e198d29c..03f8adfd3 100644 --- a/cli/cmd/resources/datacollection.go +++ b/cli/cmd/resources/datacollection.go @@ -53,6 +53,9 @@ func NewDataCollectionClusterRole() *rbacv1.ClusterRole { APIGroups: []string{"apps"}, Resources: []string{ "replicasets", + "deployments", + "daemonsets", + "statefulsets", }, }, }, diff --git a/cli/cmd/resources/instrumentor.go b/cli/cmd/resources/instrumentor.go index 5a987c0b3..a9cd2776b 100644 --- a/cli/cmd/resources/instrumentor.go +++ b/cli/cmd/resources/instrumentor.go @@ -420,25 +420,6 @@ func NewInstrumentorDeployment(version string, telemetryEnabled bool, sidecarIns }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - { - Name: "apis-rbac-proxy", - Image: "gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0", - Args: []string{ - "--secure-listen-address=0.0.0.0:8443", - "--upstream=http://127.0.0.1:8080/", - "--logtostderr=true", - "--v=0", - }, - Ports: []corev1.ContainerPort{ - { - Name: "https", - HostPort: 0, - ContainerPort: 8443, - Protocol: "TCP", - }, - }, - Resources: corev1.ResourceRequirements{}, - }, { Name: "manager", Image: fmt.Sprintf("%s:%s", instrumentorImage, version), diff --git a/cli/cmd/resources/scheduler.go b/cli/cmd/resources/scheduler.go index 4f7f3cbbe..5bd563f0d 100644 --- a/cli/cmd/resources/scheduler.go +++ b/cli/cmd/resources/scheduler.go @@ -2,6 +2,7 @@ package resources import ( "fmt" + "github.com/keyval-dev/odigos/cli/pkg/labels" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -208,25 +209,6 @@ func NewSchedulerDeployment(version string) *appsv1.Deployment { }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - { - Name: "apis-rbac-proxy", - Image: "gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0", - Args: []string{ - "--secure-listen-address=0.0.0.0:8443", - "--upstream=http://127.0.0.1:8080/", - "--logtostderr=true", - "--v=0", - }, - Ports: []corev1.ContainerPort{ - { - Name: "https", - HostPort: 0, - ContainerPort: 8443, - Protocol: "TCP", - }, - }, - Resources: corev1.ResourceRequirements{}, - }, { Name: "manager", Image: fmt.Sprintf("%s:%s", schedulerImage, version), diff --git a/ui/pages/api/source/[namespace]/[kind]/[name].ts b/ui/pages/api/source/[namespace]/[kind]/[name].ts index bb2fc0940..932deca81 100644 --- a/ui/pages/api/source/[namespace]/[kind]/[name].ts +++ b/ui/pages/api/source/[namespace]/[kind]/[name].ts @@ -17,13 +17,13 @@ export default async function UpdateSource( const k8sApi = kc.makeApiClient(k8s.AppsV1Api); switch (req.query.kind.toLowerCase()) { case "deployment": - await updateDeployment(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled); + await updateDeployment(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled, req.body.reportedName); break; case "statefulset": - await updateStatefulSet(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled); + await updateStatefulSet(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled, req.body.reportedName); break; case "daemonset": - await updateDaemonSet(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled); + await updateDaemonSet(k8sApi, req.query.namespace as string, req.query.name as string, req.body.enabled, req.body.reportedName); break; default: return res.status(400).json({ @@ -34,45 +34,31 @@ export default async function UpdateSource( return res.status(200).json({ message: "success", }); - - // const resp: any = await k8sApi.getNamespacedCustomObject( - // "odigos.io", - // "v1alpha1", - // req.query.namespace as string, - // "instrumentedapplications", - // `${req.query.kind}-${req.query.name}` - // ); - - // resp.body.spec.enabled = req.body.enabled; - // await k8sApi.replaceNamespacedCustomObject( - // "odigos.io", - // "v1alpha1", - // req.query.namespace as string, - // "instrumentedapplications", - // `${req.query.kind}-${req.query.name}`, - // resp.body - // ); - - // res.status(200).json({ sucess: true }); } -async function updateDeployment(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean) { +async function updateDeployment(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean, reportedName: string) { const resp: any = await k8sApi.readNamespacedDeployment(name, namespace); resp.body.metadata.labels = resp.body.metadata.labels || {}; resp.body.metadata.labels["odigos-instrumentation"] = enabled ? "enabled" : "disabled"; + resp.body.metadata.annotations = resp.body.metadata.annotations || {}; + resp.body.metadata.annotations["odigos.io/reported-name"] = reportedName; await k8sApi.replaceNamespacedDeployment(name, namespace, resp.body); } -async function updateStatefulSet(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean) { +async function updateStatefulSet(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean, reportedName: string) { const resp: any = await k8sApi.readNamespacedStatefulSet(name, namespace); resp.body.metadata.labels = resp.body.metadata.labels || {}; resp.body.metadata.labels["odigos-instrumentation"] = enabled ? "enabled" : "disabled"; + resp.body.metadata.annotations = resp.body.metadata.annotations || {}; + resp.body.metadata.annotations["odigos.io/reported-name"] = reportedName; await k8sApi.replaceNamespacedStatefulSet(name, namespace, resp.body); } -async function updateDaemonSet(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean) { +async function updateDaemonSet(k8sApi: k8s.AppsV1Api, namespace: string, name: string, enabled: boolean, reportedName: string) { const resp: any = await k8sApi.readNamespacedDaemonSet(name, namespace); resp.body.metadata.labels = resp.body.metadata.labels || {}; resp.body.metadata.labels["odigos-instrumentation"] = enabled ? "enabled" : "disabled"; + resp.body.metadata.annotations = resp.body.metadata.annotations || {}; + resp.body.metadata.annotations["odigos.io/reported-name"] = reportedName; await k8sApi.replaceNamespacedDaemonSet(name, namespace, resp.body); } \ No newline at end of file diff --git a/ui/pages/source/[namespace]/[kind]/[name].tsx b/ui/pages/source/[namespace]/[kind]/[name].tsx index c1a3a8c7c..cc96d7172 100644 --- a/ui/pages/source/[namespace]/[kind]/[name].tsx +++ b/ui/pages/source/[namespace]/[kind]/[name].tsx @@ -5,12 +5,14 @@ import { useState } from "react"; interface EditAppProps { enabled: boolean; + reportedName: string; } -const EditAppPage: NextPage = ({ enabled }: EditAppProps) => { +const EditAppPage: NextPage = ({ enabled, reportedName }: EditAppProps) => { const router = useRouter(); const { name, kind, namespace } = router.query; const [isEnabled, setIsEnabled] = useState(enabled); + const [updatedReportedName, setUpdatedReportedName] = useState(reportedName); const updateApp = async () => { const resp = await fetch(`/api/source/${namespace}/${kind}/${name}`, { method: "POST", @@ -19,6 +21,7 @@ const EditAppPage: NextPage = ({ enabled }: EditAppProps) => { }, body: JSON.stringify({ enabled: isEnabled, + reportedName: updatedReportedName, }), }); if (resp.ok) { @@ -28,9 +31,33 @@ const EditAppPage: NextPage = ({ enabled }: EditAppProps) => { return (
{name}
+
+ +