From 552a672cd286fdc41c14ab956efec604b8be5f6c Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Mon, 29 Apr 2024 16:02:58 +0530
Subject: [PATCH 1/7] Instrumented open telemetry

---
 server/cmd/server/main.go                  |  83 +++++++++++++++-
 server/go.mod                              |  35 +++++--
 server/go.sum                              |  90 +++++++++++------
 server/pkg/api/get_clusters.go             |   7 ++
 server/pkg/api/new_cluster_registration.go |   8 ++
 server/pkg/config/config.go                |   1 +
 server/pkg/opentelemetry/opentelemetry.go  | 109 +++++++++++++++++++++
 7 files changed, 292 insertions(+), 41 deletions(-)
 create mode 100644 server/pkg/opentelemetry/opentelemetry.go

diff --git a/server/cmd/server/main.go b/server/cmd/server/main.go
index b98cba41..8fef615c 100644
--- a/server/cmd/server/main.go
+++ b/server/cmd/server/main.go
@@ -1,12 +1,15 @@
 package main
 
 import (
+	"context"
 	"fmt"
 	"net"
 	"os"
 	"os/signal"
 	"syscall"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
+	"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/reflection"
 
@@ -30,7 +33,15 @@ func main() {
 	if err != nil {
 		log.Fatal("failed to load service congfig", err)
 	}
-
+	cleanup, err := opentelemetry.InitTracer()
+	if err != nil {
+		log.Errorf("unable to set the open telemetry , error: %v", err)
+	}
+	defer func() {
+		if cleanup != nil {
+			cleanup(context.Background())
+		}
+	}()
 	err = iamclient.RegisterService(log)
 	if err != nil {
 		log.Fatalf("%v", err)
@@ -84,12 +95,38 @@ func main() {
 		log.Fatal("failed to listen: ", err)
 	}
 
+	//grpc.NewServer(
+	//	grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()),
+	//	grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()))
+	// authInterceptor := grpc.UnaryInterceptor(rpcServer.AuthInterceptor)
+
 	var grpcServer *grpc.Server
-	if cfg.AuthEnabled {
+	if (cfg.OptelEnabled) && (cfg.AuthEnabled) {
+
+		log.Info("Server Authentication and opentelemetry is enabled")
+
+		interceptor := CombineInterceptors(rpcServer.AuthInterceptor, otelgrpc.UnaryServerInterceptor())
+
+		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(interceptor))
+
+		// log.Info("Server Authentication disabled but opentelemetry instrumented")
+
+		// grpcServer = grpc.NewServer()
+	} else if cfg.OptelEnabled {
+
+		log.Info("Opentelemetry is enabled")
+
+		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()))
+
+	} else if cfg.AuthEnabled {
+
 		log.Info("Server Authentication enabled")
+
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(rpcServer.AuthInterceptor))
 	} else {
+
 		log.Info("Server Authentication disabled")
+
 		grpcServer = grpc.NewServer()
 	}
 
@@ -110,3 +147,45 @@ func main() {
 	<-signals
 	log.Info("interrupt received, exiting")
 }
+
+// CombineInterceptors combines multiple unary interceptors into one
+func CombineInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
+	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
+		// Chain the interceptors
+		chained := handler
+		for i := len(interceptors) - 1; i >= 0; i-- {
+			chained = chainedInterceptor(interceptors[i], chained)
+		}
+		// Call the combined interceptors
+		return chained(ctx, req)
+	}
+}
+
+// chainedInterceptor chains two unary interceptors together
+func chainedInterceptor(a grpc.UnaryServerInterceptor, b grpc.UnaryHandler) grpc.UnaryHandler {
+	return func(ctx context.Context, req interface{}) (interface{}, error) {
+		// Call the first interceptor, passing the next handler as the next interceptor
+		return a(ctx, req, nil, b)
+	}
+}
+
+// CombineInterceptors combines multiple unary interceptors into one
+// func CombineInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
+// 	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
+// 		// Chain the interceptors
+// 		chained := handler
+// 		for i := len(interceptors) - 1; i >= 0; i-- {
+// 			chained = chainedInterceptor(interceptors[i], info, chained)
+// 		}
+// 		// Call the combined interceptors
+// 		return chained(ctx, req)
+// 	}
+// }
+
+// // chainedInterceptor chains two unary interceptors together
+// func chainedInterceptor(a grpc.UnaryServerInterceptor, info *grpc.UnaryServerInfo, b grpc.UnaryHandler) grpc.UnaryHandler {
+// 	return func(ctx context.Context, req interface{}) (interface{}, error) {
+// 		// Call the first interceptor, passing the next handler as the next interceptor
+// 		return a(ctx, req, info, b)
+// 	}
+// }
diff --git a/server/go.mod b/server/go.mod
index 25000793..c1a7d70b 100644
--- a/server/go.mod
+++ b/server/go.mod
@@ -5,7 +5,7 @@ go 1.21
 require (
 	github.com/go-git/go-git/v5 v5.11.0
 	github.com/gocql/gocql v1.3.1
-	github.com/google/uuid v1.4.0
+	github.com/google/uuid v1.6.0
 	github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1
 	github.com/intelops/go-common v1.0.20
 	github.com/kelseyhightower/envconfig v1.4.0
@@ -13,18 +13,21 @@ require (
 	github.com/ory/client-go v1.1.49
 	github.com/pkg/errors v0.9.1
 	github.com/stargate/stargate-grpc-go-client v0.0.0-20220822130422-9a1c6261d4fa
-	golang.org/x/oauth2 v0.14.0
-	google.golang.org/grpc v1.59.0
-	google.golang.org/protobuf v1.31.0
+	golang.org/x/oauth2 v0.17.0
+	google.golang.org/grpc v1.63.2
+	google.golang.org/protobuf v1.33.0
 	gopkg.in/yaml.v2 v2.4.0
 )
 
+require github.com/stretchr/testify v1.9.0 // indirect
+
 require (
 	dario.cat/mergo v1.0.0 // indirect
 	github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
 	github.com/Microsoft/go-winio v0.6.1 // indirect
 	github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
 	github.com/cenkalti/backoff/v3 v3.0.0 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
 	github.com/cloudflare/circl v1.3.3 // indirect
 	github.com/containerd/containerd v1.7.13 // indirect
 	github.com/cyphar/filepath-securejoin v0.2.4 // indirect
@@ -36,9 +39,12 @@ require (
 	github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
 	github.com/go-git/go-billy/v5 v5.5.0 // indirect
 	github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+	github.com/go-logr/logr v1.4.1 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
-	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
 	github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
@@ -71,15 +77,24 @@ require (
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/skeema/knownhosts v1.2.1 // indirect
 	github.com/xanzy/ssh-agent v0.3.3 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 // indirect
+	go.opentelemetry.io/otel v1.26.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 // indirect
+	go.opentelemetry.io/otel/metric v1.26.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.26.0 // indirect
+	go.opentelemetry.io/otel/trace v1.26.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.2.0 // indirect
+	golang.org/x/crypto v0.22.0 // indirect
 	golang.org/x/mod v0.12.0 // indirect
-	golang.org/x/net v0.19.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/net v0.24.0 // indirect
+	golang.org/x/sys v0.19.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	golang.org/x/tools v0.13.0 // indirect
-	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
+	google.golang.org/appengine v1.6.8 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/warnings.v0 v0.1.2 // indirect
 )
diff --git a/server/go.sum b/server/go.sum
index 1f774e52..f29bd4a1 100644
--- a/server/go.sum
+++ b/server/go.sum
@@ -22,6 +22,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c=
 github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
 github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
 github.com/containerd/containerd v1.7.13 h1:wPYKIeGMN8vaggSKuV1X0wZulpMz4CrgEsZdaCyB6Is=
@@ -58,6 +60,11 @@ github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3c
 github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
 github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
 github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw=
 github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/gocql/gocql v1.3.1 h1:BTwM4rux+ah5G3oH6/MQa+tur/TDd/XAAOXDxBBs7rg=
@@ -66,10 +73,10 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
-github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -78,10 +85,12 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
-github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 h1:HcUWd006luQPljE73d5sk+/VgYPGUReEVz2y1/qylwY=
 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1/go.mod h1:w9Y7gY31krpLmrVU5ZPG9H7l9fZuRu5/3R3S3FMtVQ4=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM=
 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -201,13 +210,29 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/testcontainers/testcontainers-go v0.11.1 h1:FiYsB83LSGbiawoV8TpAZGfcCUbtaeeg1SXqEKUxh08=
 github.com/testcontainers/testcontainers-go v0.11.1/go.mod h1:/V0UVq+1e7NWYoqTPog179clf0Qp9TOyp4EcXaEFQz8=
 github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
 github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 h1:A3SayB3rNyt+1S6qpI9mHPkeHTZbD7XILEqWnYZb2l0=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0/go.mod h1:27iA5uvhuRNmalO+iEUdVn5ZMj2qy10Mm+XRIpRmyuU=
+go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs=
+go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 h1:Waw9Wfpo/IXzOI8bCB7DIk+0JZcqqsyn1JFnAc+iam8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0/go.mod h1:wnJIG4fOqyynOnnQF/eQb4/16VlX2EJAHhHgqIqWfAo=
+go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30=
+go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4=
+go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8=
+go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs=
+go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA=
+go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0=
+go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94=
+go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@@ -215,14 +240,15 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0
 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -231,15 +257,17 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
-golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0=
-golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
+golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -262,20 +290,21 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
+golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
@@ -292,16 +321,19 @@ golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
 golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
-google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
-google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
-google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
+google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
+google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=
+google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0=
+google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
+google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
diff --git a/server/pkg/api/get_clusters.go b/server/pkg/api/get_clusters.go
index 8f8ace31..d4e455c7 100644
--- a/server/pkg/api/get_clusters.go
+++ b/server/pkg/api/get_clusters.go
@@ -3,12 +3,19 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
 )
 
 func (s *Server) GetClusters(ctx context.Context, request *serverpb.GetClustersRequest) (
 	*serverpb.GetClustersResponse, error) {
+
+	_, span := opentelemetry.GetTracer("Get Clusters").
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
 	orgId, err := validateOrgWithArgs(ctx)
+
 	if err != nil {
 		s.log.Infof("request validation failed", err)
 		return &serverpb.GetClustersResponse{
diff --git a/server/pkg/api/new_cluster_registration.go b/server/pkg/api/new_cluster_registration.go
index 4357db96..35368334 100644
--- a/server/pkg/api/new_cluster_registration.go
+++ b/server/pkg/api/new_cluster_registration.go
@@ -6,12 +6,20 @@ import (
 	"github.com/gocql/gocql"
 	"github.com/kube-tarian/kad/server/pkg/agent"
 	"github.com/kube-tarian/kad/server/pkg/credential"
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) NewClusterRegistration(ctx context.Context, request *serverpb.NewClusterRegistrationRequest) (
 	*serverpb.NewClusterRegistrationResponse, error) {
 	orgId, err := validateOrgWithArgs(ctx)
+	_, span := opentelemetry.GetTracer(request.GetClusterName()).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.ClusterName))
+	span.SetAttributes(attribute.String("Agent EndPoint", request.AgentEndpoint))
 	if err != nil {
 		s.log.Infof("request validation failed", err)
 		return &serverpb.NewClusterRegistrationResponse{
diff --git a/server/pkg/config/config.go b/server/pkg/config/config.go
index 0a4dfac3..d21e5925 100644
--- a/server/pkg/config/config.go
+++ b/server/pkg/config/config.go
@@ -13,6 +13,7 @@ type ServiceConfig struct {
 	Database                 string `envconfig:"DATABASE" default:"astra"`
 	CleanupDatabase          bool   `envconfig:"CLEANUP_DATABASE" default:"false"`
 	AuthEnabled              bool   `envconfig:"AUTH_ENABLED" default:"false"`
+	OptelEnabled             bool   `envconfig:"IS_OPTEL_ENABLED" default:"true"`
 	RegisterLaunchAppsConifg bool   `envconfig:"REGISTER_LAUNCH_APPS_CONFIG" default:"true"`
 	CaptenOAuthURL           string `envconfig:"CAPTEN_OAUTH_URL" default:"https://alpha.optimizor.app/api/.ory"`
 }
diff --git a/server/pkg/opentelemetry/opentelemetry.go b/server/pkg/opentelemetry/opentelemetry.go
new file mode 100644
index 00000000..f873ff17
--- /dev/null
+++ b/server/pkg/opentelemetry/opentelemetry.go
@@ -0,0 +1,109 @@
+package opentelemetry
+
+import (
+	"context"
+	"os"
+
+	"github.com/kelseyhightower/envconfig"
+	"github.com/pkg/errors"
+	logger "github.com/sirupsen/logrus"
+
+	"go.opentelemetry.io/otel"
+	"go.opentelemetry.io/otel/attribute"
+	"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
+	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
+	"go.opentelemetry.io/otel/propagation"
+	"go.opentelemetry.io/otel/sdk/resource"
+	"go.opentelemetry.io/otel/sdk/trace"
+	tre "go.opentelemetry.io/otel/trace"
+	"google.golang.org/grpc/credentials"
+)
+
+type Configurations struct {
+	ServiceName  string `envconfig:"APPLICATION_NAME" default:"Applications"`
+	CollectorURL string `envconfig:"OPTE_URL" default:"otelcollector.dev.optimizor.app:80"`
+	IsInsecure   bool   `envconfig:"IS_OPTE_INSECURE" default:"true"`
+	IsEnabled    bool   `envconfig:"IS_OPTEL_ENABLED" default:"true"`
+}
+
+func getConfigurations() (opteConfig *Configurations, err error) {
+	opteConfig = &Configurations{}
+	if err = envconfig.Process("", opteConfig); err != nil {
+		return nil, errors.WithStack(err)
+	}
+	return
+
+}
+
+func InitTracer() (func(context.Context) error, error) {
+	config, err := getConfigurations()
+	if err != nil {
+		logger.Errorf("Unable to read open telemetry configurations")
+		return nil, err
+	}
+	if !config.IsEnabled {
+		return nil, nil
+	}
+
+	headers := map[string]string{
+		"signoz-service-name": config.ServiceName,
+	}
+	secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
+	if config.IsInsecure {
+		secureOption = otlptracegrpc.WithInsecure()
+	}
+
+	exporter, err := otlptrace.New(
+		context.Background(),
+		otlptracegrpc.NewClient(
+			secureOption,
+			otlptracegrpc.WithEndpoint(config.CollectorURL),
+			otlptracegrpc.WithHeaders(headers),
+		),
+	)
+
+	if err != nil {
+		logger.Errorf("unble initialize new object , error : %v", err)
+		return nil, err
+	}
+	resources, err := resource.New(
+		context.Background(),
+		resource.WithAttributes(
+			attribute.String("service.name", config.ServiceName),
+			attribute.String("library.language", "go"),
+		),
+	)
+	if err != nil {
+		logger.Errorf("Could not set resources:%v ", err)
+		return nil, err
+	}
+
+	traceProvider := trace.NewTracerProvider(
+		trace.WithSampler(trace.AlwaysSample()),
+		trace.WithBatcher(exporter),
+		trace.WithResource(resources),
+	)
+
+	otel.SetTracerProvider(traceProvider)
+	otel.SetTextMapPropagator(
+		propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
+	return exporter.Shutdown, nil
+}
+
+var tracer tre.Tracer
+
+func GetTracer(defaultValue string) tre.Tracer {
+	if tracer == nil {
+		serviceName := os.Getenv("APPLICATION_NAME")
+		if serviceName == "" || serviceName == "Applications" {
+			serviceName = defaultValue
+		}
+		tracer = otel.Tracer(serviceName)
+	}
+	return tracer
+}
+
+func BuildContext(ctx context.Context) context.Context {
+	newCtx, _ := context.WithCancel(ctx)
+	return newCtx
+}

From d36b915ef78a04cd44089561b2aa312046062e6d Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Mon, 29 Apr 2024 21:23:20 +0530
Subject: [PATCH 2/7] Instrumented opentelemetry

---
 server/pkg/opentelemetry/opentelemetry.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/pkg/opentelemetry/opentelemetry.go b/server/pkg/opentelemetry/opentelemetry.go
index f873ff17..70d9d578 100644
--- a/server/pkg/opentelemetry/opentelemetry.go
+++ b/server/pkg/opentelemetry/opentelemetry.go
@@ -21,8 +21,8 @@ import (
 
 type Configurations struct {
 	ServiceName  string `envconfig:"APPLICATION_NAME" default:"Applications"`
-	CollectorURL string `envconfig:"OPTE_URL" default:"otelcollector.dev.optimizor.app:80"`
-	IsInsecure   bool   `envconfig:"IS_OPTE_INSECURE" default:"true"`
+	CollectorURL string `envconfig:"OPTE_URL" default:"otelcollector.awsagent.optimizor.app:80"`
+	IsInsecure   bool   `envconfig:"IS_OPTEL_INSECURE" default:"true"`
 	IsEnabled    bool   `envconfig:"IS_OPTEL_ENABLED" default:"true"`
 }
 

From a6d3dfa86fd57e230137ce0e33db79b681769f6a Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Mon, 29 Apr 2024 22:12:22 +0530
Subject: [PATCH 3/7] Instrumented opentelemetry

---
 server/cmd/server/main.go                 | 7 ++++---
 server/pkg/opentelemetry/opentelemetry.go | 1 +
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/server/cmd/server/main.go b/server/cmd/server/main.go
index 8fef615c..7e3e80ba 100644
--- a/server/cmd/server/main.go
+++ b/server/cmd/server/main.go
@@ -103,6 +103,7 @@ func main() {
 	var grpcServer *grpc.Server
 	if (cfg.OptelEnabled) && (cfg.AuthEnabled) {
 
+		log.Info("OPtel Enabled", cfg.OptelEnabled)
 		log.Info("Server Authentication and opentelemetry is enabled")
 
 		interceptor := CombineInterceptors(rpcServer.AuthInterceptor, otelgrpc.UnaryServerInterceptor())
@@ -113,18 +114,18 @@ func main() {
 
 		// grpcServer = grpc.NewServer()
 	} else if cfg.OptelEnabled {
-
+		log.Info("OPtel Enabled", cfg.OptelEnabled)
 		log.Info("Opentelemetry is enabled")
 
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()))
 
 	} else if cfg.AuthEnabled {
-
+		log.Info("OPtel Enabled", cfg.OptelEnabled)
 		log.Info("Server Authentication enabled")
 
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(rpcServer.AuthInterceptor))
 	} else {
-
+		log.Info("OPtel Enabled", cfg.OptelEnabled)
 		log.Info("Server Authentication disabled")
 
 		grpcServer = grpc.NewServer()
diff --git a/server/pkg/opentelemetry/opentelemetry.go b/server/pkg/opentelemetry/opentelemetry.go
index 70d9d578..f3f934c5 100644
--- a/server/pkg/opentelemetry/opentelemetry.go
+++ b/server/pkg/opentelemetry/opentelemetry.go
@@ -37,6 +37,7 @@ func getConfigurations() (opteConfig *Configurations, err error) {
 
 func InitTracer() (func(context.Context) error, error) {
 	config, err := getConfigurations()
+	logger.Info("Getting optel config", config.CollectorURL, config.IsEnabled)
 	if err != nil {
 		logger.Errorf("Unable to read open telemetry configurations")
 		return nil, err

From 7bba9ec0bcd01f467d2a88831db590535cb2b575 Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Tue, 7 May 2024 21:07:39 +0530
Subject: [PATCH 4/7] Instrumented with Open Telemetry

---
 capten/agent/internal/api/store_cred_apis.go  |  3 +++
 capten/common-pkg/plugins/argocd/clusters.go  |  1 +
 server/pkg/api/add_store_apps.go              |  8 ++++++++
 server/pkg/api/agent.go                       |  9 +++++++++
 server/pkg/api/delete_cluster_registration.go | 10 ++++++++++
 server/pkg/api/delete_store_app.go            |  8 ++++++++
 server/pkg/api/deploy_store_app.go            |  9 +++++++++
 server/pkg/api/get_cluster.go                 |  6 ++++++
 server/pkg/api/get_cluster_app.go             |  9 +++++++++
 server/pkg/api/get_cluster_app_launches.go    |  9 +++++++++
 server/pkg/api/get_cluster_apps.go            |  8 ++++++++
 server/pkg/api/get_store_app.go               |  8 ++++++++
 server/pkg/api/get_store_app_values.go        | 10 ++++++++++
 server/pkg/api/get_store_apps.go              |  6 ++++++
 server/pkg/api/undeploy_store_app.go          |  9 +++++++++
 server/pkg/api/update_cluster_registration.go | 10 ++++++++++
 server/pkg/api/update_store_app.go            |  9 +++++++++
 server/pkg/api/upgrade_store_app.go           | 10 ++++++++++
 18 files changed, 142 insertions(+)

diff --git a/capten/agent/internal/api/store_cred_apis.go b/capten/agent/internal/api/store_cred_apis.go
index 26997574..9a73a91d 100644
--- a/capten/agent/internal/api/store_cred_apis.go
+++ b/capten/agent/internal/api/store_cred_apis.go
@@ -7,6 +7,7 @@ import (
 	"github.com/kube-tarian/kad/capten/common-pkg/agentpb"
 	"github.com/kube-tarian/kad/capten/common-pkg/k8s"
 	vaultcred "github.com/kube-tarian/kad/capten/common-pkg/vault-cred"
+	
 	v1 "k8s.io/api/core/v1"
 
 	"github.com/kube-tarian/kad/capten/common-pkg/credential"
@@ -20,6 +21,8 @@ var (
 )
 
 func (a *Agent) StoreCredential(ctx context.Context, request *agentpb.StoreCredentialRequest) (*agentpb.StoreCredentialResponse, error) {
+
+	
 	credPath := fmt.Sprintf("%s/%s/%s", request.CredentialType, request.CredEntityName, request.CredIdentifier)
 	credAdmin, err := credentials.NewCredentialAdmin(ctx)
 	if err != nil {
diff --git a/capten/common-pkg/plugins/argocd/clusters.go b/capten/common-pkg/plugins/argocd/clusters.go
index 665a3ab1..44873d7f 100644
--- a/capten/common-pkg/plugins/argocd/clusters.go
+++ b/capten/common-pkg/plugins/argocd/clusters.go
@@ -119,6 +119,7 @@ func (a *ArgoCDClient) DeleteCluster(ctx context.Context, clusterURL string) (*c
 }
 
 func (a *ArgoCDClient) GetCluster(ctx context.Context, clusterURL string) (*v1alpha1.Cluster, error) {
+
 	conn, appClient, err := a.client.NewClusterClient()
 	if err != nil {
 		return nil, err
diff --git a/server/pkg/api/add_store_apps.go b/server/pkg/api/add_store_apps.go
index d7fb47f5..abdf3c3b 100644
--- a/server/pkg/api/add_store_apps.go
+++ b/server/pkg/api/add_store_apps.go
@@ -4,12 +4,20 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
 	"github.com/kube-tarian/kad/server/pkg/types"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) AddStoreApp(ctx context.Context, request *serverpb.AddStoreAppRequest) (
 	*serverpb.AddStoreAppResponse, error) {
+
+	_, span := opentelemetry.GetTracer("Add Store App").
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+	span.SetAttributes(attribute.String("Cluster Name", request.AppConfig.AppName))
+
 	err := validateArgs(request.AppConfig.AppName, request.AppConfig.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/agent.go b/server/pkg/api/agent.go
index 50c20c62..2c0dcde2 100644
--- a/server/pkg/api/agent.go
+++ b/server/pkg/api/agent.go
@@ -4,12 +4,21 @@ import (
 	"context"
 
 	"github.com/intelops/go-common/credentials"
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) StoreCredential(ctx context.Context, request *serverpb.StoreCredentialRequest) (
 	*serverpb.StoreCredentialResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
+
 	metadataMap := metadataContextToMap(ctx)
 	orgId := metadataMap[organizationIDAttribute]
 	if orgId == "" {
diff --git a/server/pkg/api/delete_cluster_registration.go b/server/pkg/api/delete_cluster_registration.go
index b1fff001..5e8cb205 100644
--- a/server/pkg/api/delete_cluster_registration.go
+++ b/server/pkg/api/delete_cluster_registration.go
@@ -4,11 +4,21 @@ import (
 	"context"
 
 	"github.com/kube-tarian/kad/server/pkg/credential"
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) DeleteClusterRegistration(ctx context.Context, request *serverpb.DeleteClusterRegistrationRequest) (
 	*serverpb.DeleteClusterRegistrationResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.ClusterID))
+	
+
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/delete_store_app.go b/server/pkg/api/delete_store_app.go
index 404854f3..87df350f 100644
--- a/server/pkg/api/delete_store_app.go
+++ b/server/pkg/api/delete_store_app.go
@@ -3,11 +3,19 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) DeleteStoreApp(ctx context.Context, request *serverpb.DeleteStoreAppRequest) (
 	*serverpb.DeleteStoreAppResponse, error) {
+	_, span := opentelemetry.GetTracer(request.AppName).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.AppName))
+	span.SetAttributes(attribute.String("Agent EndPoint", request.Version))
 	err := validateArgs(request.AppName, request.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/deploy_store_app.go b/server/pkg/api/deploy_store_app.go
index 80b81615..9b1ffa08 100644
--- a/server/pkg/api/deploy_store_app.go
+++ b/server/pkg/api/deploy_store_app.go
@@ -4,12 +4,21 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) DeployStoreApp(ctx context.Context, request *serverpb.DeployStoreAppRequest) (
 	*serverpb.DeployStoreAppResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("App Name", request.AppName))
+	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.AppName, request.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/get_cluster.go b/server/pkg/api/get_cluster.go
index e21f80ea..7f6d8e8f 100644
--- a/server/pkg/api/get_cluster.go
+++ b/server/pkg/api/get_cluster.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
 )
@@ -15,6 +16,11 @@ const (
 
 func (s *Server) GetClusterDetails(ctx context.Context, request *serverpb.GetClusterDetailsRequest) (
 	*serverpb.GetClusterDetailsResponse, error) {
+
+	_, span := opentelemetry.GetTracer("GetClusterDetails").
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
 	orgId, err := validateOrgWithArgs(ctx)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/get_cluster_app.go b/server/pkg/api/get_cluster_app.go
index f843b4ab..3c180069 100644
--- a/server/pkg/api/get_cluster_app.go
+++ b/server/pkg/api/get_cluster_app.go
@@ -4,10 +4,19 @@ import (
 	"context"
 	"fmt"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) GetClusterApp(ctx context.Context, request *serverpb.GetClusterAppRequest) (
 	*serverpb.GetClusterAppResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
+	span.SetAttributes(attribute.String("AppReleaseName", request.AppReleaseName))
 	return &serverpb.GetClusterAppResponse{}, fmt.Errorf("not implemented")
 }
diff --git a/server/pkg/api/get_cluster_app_launches.go b/server/pkg/api/get_cluster_app_launches.go
index 48159f19..4365a468 100644
--- a/server/pkg/api/get_cluster_app_launches.go
+++ b/server/pkg/api/get_cluster_app_launches.go
@@ -3,11 +3,20 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) GetClusterAppLaunchConfigs(ctx context.Context, request *serverpb.GetClusterAppLaunchConfigsRequest) (
 	*serverpb.GetClusterAppLaunchConfigsResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Id", request.ClusterID))
+
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/get_cluster_apps.go b/server/pkg/api/get_cluster_apps.go
index 62d6098e..4f816509 100644
--- a/server/pkg/api/get_cluster_apps.go
+++ b/server/pkg/api/get_cluster_apps.go
@@ -3,12 +3,20 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) GetClusterApps(ctx context.Context, request *serverpb.GetClusterAppsRequest) (
 	*serverpb.GetClusterAppsResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.ClusterID))
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/get_store_app.go b/server/pkg/api/get_store_app.go
index 9a4ce9e0..31c93eea 100644
--- a/server/pkg/api/get_store_app.go
+++ b/server/pkg/api/get_store_app.go
@@ -4,11 +4,19 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) GetStoreApp(ctx context.Context, request *serverpb.GetStoreAppRequest) (
 	*serverpb.GetStoreAppResponse, error) {
+	_, span := opentelemetry.GetTracer(request.AppName).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("App Name", request.AppName))
+
 	orgId, err := validateOrgWithArgs(ctx, request.AppName, request.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/get_store_app_values.go b/server/pkg/api/get_store_app_values.go
index f472b803..514b80a6 100644
--- a/server/pkg/api/get_store_app_values.go
+++ b/server/pkg/api/get_store_app_values.go
@@ -3,12 +3,22 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) GetStoreAppValues(ctx context.Context, request *serverpb.GetStoreAppValuesRequest) (
 	*serverpb.GetStoreAppValuesResponse, error) {
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
+
+	_, span := opentelemetry.GetTracer(request.AppName).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.AppName))
+	span.SetAttributes(attribute.String("Agent EndPoint", request.ClusterID))
+
 	if err != nil {
 		s.log.Infof("request validation failed", err)
 		return &serverpb.GetStoreAppValuesResponse{
diff --git a/server/pkg/api/get_store_apps.go b/server/pkg/api/get_store_apps.go
index 1f10d7c8..45b0fd92 100644
--- a/server/pkg/api/get_store_apps.go
+++ b/server/pkg/api/get_store_apps.go
@@ -4,11 +4,17 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
 )
 
 func (s *Server) GetStoreApps(ctx context.Context, request *serverpb.GetStoreAppsRequest) (
 	*serverpb.GetStoreAppsResponse, error) {
+
+	_, span := opentelemetry.GetTracer("GetStoreAppsRequest").
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
 	orgId, err := validateOrgWithArgs(ctx)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/undeploy_store_app.go b/server/pkg/api/undeploy_store_app.go
index 4e54a677..b8874be9 100644
--- a/server/pkg/api/undeploy_store_app.go
+++ b/server/pkg/api/undeploy_store_app.go
@@ -3,12 +3,21 @@ package api
 import (
 	"context"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) UnDeployStoreApp(ctx context.Context, request *serverpb.UnDeployStoreAppRequest) (
 	*serverpb.UnDeployStoreAppResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
+	span.SetAttributes(attribute.String("Release Name", request.ReleaseName))
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.ReleaseName)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/update_cluster_registration.go b/server/pkg/api/update_cluster_registration.go
index 86a517b2..983a8171 100644
--- a/server/pkg/api/update_cluster_registration.go
+++ b/server/pkg/api/update_cluster_registration.go
@@ -5,12 +5,22 @@ import (
 
 	"github.com/kube-tarian/kad/server/pkg/agent"
 	"github.com/kube-tarian/kad/server/pkg/credential"
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) UpdateClusterRegistration(ctx context.Context, request *serverpb.UpdateClusterRegistrationRequest) (
 	*serverpb.UpdateClusterRegistrationResponse, error) {
+
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
+
+	_, span := opentelemetry.GetTracer(request.GetClusterName()).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster Name", request.ClusterName))
+	span.SetAttributes(attribute.String("Agent EndPoint", request.AgentEndpoint))
 	if err != nil {
 		s.log.Infof("request validation failed", err)
 		return &serverpb.UpdateClusterRegistrationResponse{
diff --git a/server/pkg/api/update_store_app.go b/server/pkg/api/update_store_app.go
index 6e39448b..5bed5ef8 100644
--- a/server/pkg/api/update_store_app.go
+++ b/server/pkg/api/update_store_app.go
@@ -4,12 +4,21 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
 	"github.com/kube-tarian/kad/server/pkg/types"
+	"go.opentelemetry.io/otel/attribute"
 )
 
 func (s *Server) UpdateStoreApp(ctx context.Context, request *serverpb.UpdateStoreAppRequest) (
 	*serverpb.UpdateStoreAppRsponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.AppConfig.AppName).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("App Name", request.AppConfig.AppName))
+
 	_, err := validateOrgWithArgs(ctx, request.AppConfig.AppName, request.AppConfig.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)
diff --git a/server/pkg/api/upgrade_store_app.go b/server/pkg/api/upgrade_store_app.go
index 6bffc09e..8e75291a 100644
--- a/server/pkg/api/upgrade_store_app.go
+++ b/server/pkg/api/upgrade_store_app.go
@@ -4,13 +4,23 @@ import (
 	"context"
 	"encoding/hex"
 
+	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
 	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
 	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
+	"go.opentelemetry.io/otel/attribute"
 	"gopkg.in/yaml.v2"
 )
 
 func (s *Server) UpgradeStoreApp(ctx context.Context, request *serverpb.UpgradeStoreAppRequest) (
 	*serverpb.UpgradeStoreAppResponse, error) {
+
+	_, span := opentelemetry.GetTracer(request.ClusterID).
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
+	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
+	span.SetAttributes(attribute.String("App Name", request.AppName))
+
 	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.AppName, request.Version)
 	if err != nil {
 		s.log.Infof("request validation failed", err)

From 7fa70f4b67c16ca2b3e3a278c779ef7c5154ca17 Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Wed, 8 May 2024 16:06:24 +0530
Subject: [PATCH 5/7] Resolved conflicts

---
 server/pkg/api/add_store_apps.go       |  67 --------------
 server/pkg/api/delete_store_app.go     |  43 ---------
 server/pkg/api/deploy_store_app.go     | 119 -------------------------
 server/pkg/api/get_store_app.go        |  64 -------------
 server/pkg/api/get_store_app_values.go |  66 --------------
 server/pkg/api/get_store_apps.go       |  90 -------------------
 server/pkg/api/undeploy_store_app.go   |  61 -------------
 server/pkg/api/update_store_app.go     |  66 --------------
 server/pkg/api/upgrade_store_app.go    | 112 -----------------------
 9 files changed, 688 deletions(-)
 delete mode 100644 server/pkg/api/add_store_apps.go
 delete mode 100644 server/pkg/api/delete_store_app.go
 delete mode 100644 server/pkg/api/deploy_store_app.go
 delete mode 100644 server/pkg/api/get_store_app.go
 delete mode 100644 server/pkg/api/get_store_app_values.go
 delete mode 100644 server/pkg/api/get_store_apps.go
 delete mode 100644 server/pkg/api/undeploy_store_app.go
 delete mode 100644 server/pkg/api/update_store_app.go
 delete mode 100644 server/pkg/api/upgrade_store_app.go

diff --git a/server/pkg/api/add_store_apps.go b/server/pkg/api/add_store_apps.go
deleted file mode 100644
index abdf3c3b..00000000
--- a/server/pkg/api/add_store_apps.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"github.com/kube-tarian/kad/server/pkg/types"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) AddStoreApp(ctx context.Context, request *serverpb.AddStoreAppRequest) (
-	*serverpb.AddStoreAppResponse, error) {
-
-	_, span := opentelemetry.GetTracer("Add Store App").
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-	span.SetAttributes(attribute.String("Cluster Name", request.AppConfig.AppName))
-
-	err := validateArgs(request.AppConfig.AppName, request.AppConfig.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.AddStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Add store app [%s:%s] request recieved", request.AppConfig.AppName, request.AppConfig.Version)
-
-	config := &types.StoreAppConfig{
-		ReleaseName:         request.AppConfig.ReleaseName,
-		AppName:             request.AppConfig.AppName,
-		Version:             request.AppConfig.Version,
-		Category:            request.AppConfig.Category,
-		Description:         request.AppConfig.Description,
-		ChartName:           request.AppConfig.ChartName,
-		RepoName:            request.AppConfig.RepoName,
-		RepoURL:             request.AppConfig.RepoURL,
-		Namespace:           request.AppConfig.Namespace,
-		CreateNamespace:     request.AppConfig.CreateNamespace,
-		PrivilegedNamespace: request.AppConfig.PrivilegedNamespace,
-		Icon:                hex.EncodeToString(request.AppConfig.Icon),
-		LaunchURL:           request.AppConfig.LaunchURL,
-		LaunchUIDescription: request.AppConfig.LaunchUIDescription,
-		OverrideValues:      request.AppValues.OverrideValues,
-		LaunchUIValues:      request.AppValues.LaunchUIValues,
-		TemplateValues:      request.AppValues.TemplateValues,
-		PluginName:          request.AppConfig.PluginName,
-		PluginDescription:   request.AppConfig.PluginDescription,
-		APIEndpoint:         request.AppConfig.ApiEndpoint,
-	}
-
-	if err := s.serverStore.AddOrUpdateStoreApp(config); err != nil {
-		s.log.Errorf("failed to add app config to store, %v", err)
-		return &serverpb.AddStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed add app config to store",
-		}, nil
-	}
-
-	s.log.Infof("Add store app [%s:%s] request successful", request.AppConfig.AppName, request.AppConfig.Version)
-	return &serverpb.AddStoreAppResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app config is sucessfuly added to store",
-	}, nil
-}
diff --git a/server/pkg/api/delete_store_app.go b/server/pkg/api/delete_store_app.go
deleted file mode 100644
index 87df350f..00000000
--- a/server/pkg/api/delete_store_app.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package api
-
-import (
-	"context"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) DeleteStoreApp(ctx context.Context, request *serverpb.DeleteStoreAppRequest) (
-	*serverpb.DeleteStoreAppResponse, error) {
-	_, span := opentelemetry.GetTracer(request.AppName).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("Cluster Name", request.AppName))
-	span.SetAttributes(attribute.String("Agent EndPoint", request.Version))
-	err := validateArgs(request.AppName, request.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.DeleteStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Delete store app [%s:%s] request recieved", request.AppName, request.Version)
-
-	if err := s.serverStore.DeleteAppInStore(request.AppName, request.Version); err != nil {
-		s.log.Errorf("failed to delete app config from store, %v", err)
-		return &serverpb.DeleteStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to delete app config from store",
-		}, nil
-	}
-
-	s.log.Infof("Delete store app [%s:%s] request successful", request.AppName, request.Version)
-	return &serverpb.DeleteStoreAppResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app config is sucessfuly deleted",
-	}, nil
-
-}
diff --git a/server/pkg/api/deploy_store_app.go b/server/pkg/api/deploy_store_app.go
deleted file mode 100644
index 9b1ffa08..00000000
--- a/server/pkg/api/deploy_store_app.go
+++ /dev/null
@@ -1,119 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) DeployStoreApp(ctx context.Context, request *serverpb.DeployStoreAppRequest) (
-	*serverpb.DeployStoreAppResponse, error) {
-
-	_, span := opentelemetry.GetTracer(request.ClusterID).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("App Name", request.AppName))
-	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
-	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.AppName, request.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Deploy store app [%s:%s] request for cluster %s recieved, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-
-	config, err := s.serverStore.GetAppFromStore(request.AppName, request.Version)
-	if err != nil {
-		s.log.Errorf("failed to get store app values, %v", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to find store app values",
-		}, nil
-	}
-
-	overrideValues := request.OverrideValues
-	if len(request.OverrideValues) == 0 {
-		overrideValues = config.OverrideValues
-	}
-
-	clusterGlobalValues, err := s.getClusterGlobalValues(orgId, request.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to get cluster global values, %v", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to fetch cluster global values values",
-		}, nil
-	}
-
-	dervivedOverrideValues, err := s.deriveTemplateOverrideValues(overrideValues, clusterGlobalValues)
-	if err != nil {
-		s.log.Errorf("failed to update overrided store app values, %v", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to update overrided store app values",
-		}, nil
-	}
-
-	decodedIconBytes, _ := hex.DecodeString(config.Icon)
-	req := &agentpb.InstallAppRequest{
-		AppConfig: &agentpb.AppConfig{
-			AppName:             config.Name,
-			Version:             config.Version,
-			ReleaseName:         config.ReleaseName,
-			Category:            config.Category,
-			Description:         config.Description,
-			ChartName:           config.ChartName,
-			RepoName:            config.RepoName,
-			RepoURL:             config.RepoURL,
-			Namespace:           config.Namespace,
-			CreateNamespace:     config.CreateNamespace,
-			PrivilegedNamespace: config.PrivilegedNamespace,
-			Icon:                decodedIconBytes,
-			LaunchURL:           config.LaunchURL,
-			LaunchUIDescription: config.LaunchUIDescription,
-			DefualtApp:          false,
-			PluginName:          config.PluginName,
-			PluginDescription:   config.PluginDescription,
-			ApiEndpoint:         config.APIEndpoint,
-		},
-		AppValues: &agentpb.AppValues{
-			OverrideValues: dervivedOverrideValues,
-			LaunchUIValues: config.LaunchUIValues,
-			TemplateValues: config.TemplateValues,
-		},
-	}
-
-	agent, err := s.agentHandeler.GetAgent(orgId, request.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to initialize agent, %v", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to deploy the app",
-		}, nil
-	}
-
-	_, err = agent.GetClient().InstallApp(ctx, req)
-	if err != nil {
-		s.log.Errorf("failed to deploy app, %v", err)
-		return &serverpb.DeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to deploy the app",
-		}, nil
-	}
-
-	s.log.Infof("Deploy Store app [%s:%s] request request triggered for cluster %s, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-
-	return &serverpb.DeployStoreAppResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app is successfully deployed",
-	}, nil
-}
diff --git a/server/pkg/api/get_store_app.go b/server/pkg/api/get_store_app.go
deleted file mode 100644
index 31c93eea..00000000
--- a/server/pkg/api/get_store_app.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) GetStoreApp(ctx context.Context, request *serverpb.GetStoreAppRequest) (
-	*serverpb.GetStoreAppResponse, error) {
-	_, span := opentelemetry.GetTracer(request.AppName).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("App Name", request.AppName))
-
-	orgId, err := validateOrgWithArgs(ctx, request.AppName, request.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.GetStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Get store app %s:%s request recieved, [org: %s]", request.AppName, request.Version, orgId)
-
-	config, err := s.serverStore.GetAppFromStore(request.AppName, request.Version)
-	if err != nil {
-		s.log.Errorf("failed to get app config from store, %v", err)
-		return &serverpb.GetStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to get app config from store",
-		}, nil
-	}
-
-	decodedIconBytes, _ := hex.DecodeString(config.Icon)
-	appConfig := &serverpb.StoreAppConfig{
-		AppName:             config.Name,
-		Version:             config.Version,
-		Category:            config.Category,
-		Description:         config.Description,
-		ChartName:           config.ChartName,
-		RepoName:            config.RepoName,
-		RepoURL:             config.RepoURL,
-		Namespace:           config.Namespace,
-		CreateNamespace:     config.CreateNamespace,
-		PrivilegedNamespace: config.PrivilegedNamespace,
-		Icon:                decodedIconBytes,
-		LaunchURL:           config.LaunchURL,
-		LaunchUIDescription: config.LaunchUIDescription,
-		ReleaseName:         config.ReleaseName,
-	}
-
-	s.log.Infof("Fetched store app %s:%s, [org: %s]", request.AppName, request.Version, orgId)
-	return &serverpb.GetStoreAppResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app config is sucessfuly fetched from store",
-		AppConfig:     appConfig,
-	}, nil
-
-}
diff --git a/server/pkg/api/get_store_app_values.go b/server/pkg/api/get_store_app_values.go
deleted file mode 100644
index 514b80a6..00000000
--- a/server/pkg/api/get_store_app_values.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package api
-
-import (
-	"context"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) GetStoreAppValues(ctx context.Context, request *serverpb.GetStoreAppValuesRequest) (
-	*serverpb.GetStoreAppValuesResponse, error) {
-	orgId, err := validateOrgWithArgs(ctx, request.ClusterID)
-
-	_, span := opentelemetry.GetTracer(request.AppName).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("Cluster Name", request.AppName))
-	span.SetAttributes(attribute.String("Agent EndPoint", request.ClusterID))
-
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.GetStoreAppValuesResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Get store app [%s:%s] values request for cluster %s recieved, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-
-	config, err := s.serverStore.GetAppFromStore(request.AppName, request.Version)
-	if err != nil {
-		s.log.Errorf("failed to get store app values, %v", err)
-		return &serverpb.GetStoreAppValuesResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to get store app values",
-		}, nil
-	}
-
-	clusterGlobalValues, err := s.getClusterGlobalValues(orgId, request.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to get cluster global values, %v", err)
-		return &serverpb.GetStoreAppValuesResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to fetch cluster global values values",
-		}, nil
-	}
-
-	overrideValues, err := s.deriveTemplateOverrideValues(config.OverrideValues, clusterGlobalValues)
-	if err != nil {
-		s.log.Errorf("failed to update overrided store app values, %v", err)
-		return &serverpb.GetStoreAppValuesResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to update overrided store app values",
-		}, nil
-	}
-
-	s.log.Infof("Fetched store app [%s:%s] values request for cluster %s successful, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-	return &serverpb.GetStoreAppValuesResponse{
-		Status:         serverpb.StatusCode_OK,
-		StatusMessage:  "store app values sucessfuly fetched",
-		OverrideValues: overrideValues,
-	}, nil
-}
diff --git a/server/pkg/api/get_store_apps.go b/server/pkg/api/get_store_apps.go
deleted file mode 100644
index 45b0fd92..00000000
--- a/server/pkg/api/get_store_apps.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-)
-
-func (s *Server) GetStoreApps(ctx context.Context, request *serverpb.GetStoreAppsRequest) (
-	*serverpb.GetStoreAppsResponse, error) {
-
-	_, span := opentelemetry.GetTracer("GetStoreAppsRequest").
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	orgId, err := validateOrgWithArgs(ctx)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.GetStoreAppsResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Get store apps request recieved, [org: %s]", orgId)
-
-	cluster, err := s.serverStore.GetClusterForOrg(orgId)
-	if err != nil {
-		s.log.Errorf("failed to get clusterID for org %s, %v", orgId, err)
-		return &serverpb.GetStoreAppsResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed get cluster details",
-		}, err
-	}
-
-	configs, err := s.serverStore.GetAppsFromStore()
-	if err != nil {
-		s.log.Errorf("failed to get app config's from store, %v", err)
-		return &serverpb.GetStoreAppsResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to get app config's from store",
-		}, nil
-	}
-
-	clusterGlobalValues, err := s.getClusterGlobalValues(orgId, cluster.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to get cluster global values, %v", err)
-		return &serverpb.GetStoreAppsResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to fetch cluster global values values",
-		}, nil
-	}
-
-	appsData := []*serverpb.StoreAppsData{}
-	for _, config := range configs {
-		overrideValues, err := s.deriveTemplateOverrideValues(config.OverrideValues, clusterGlobalValues)
-		if err != nil {
-			s.log.Errorf("failed to update overrided store app values for app %s, %v", config.ReleaseName, err)
-		}
-
-		decodedIconBytes, _ := hex.DecodeString(config.Icon)
-		appsData = append(appsData, &serverpb.StoreAppsData{
-			AppConfigs: &serverpb.StoreAppConfig{
-				AppName:             config.Name,
-				Version:             config.Version,
-				Category:            config.Category,
-				Description:         config.Description,
-				ChartName:           config.ChartName,
-				RepoName:            config.RepoName,
-				RepoURL:             config.RepoURL,
-				Namespace:           config.Namespace,
-				CreateNamespace:     config.CreateNamespace,
-				PrivilegedNamespace: config.PrivilegedNamespace,
-				Icon:                decodedIconBytes,
-				LaunchURL:           config.LaunchURL,
-				LaunchUIDescription: config.LaunchUIDescription,
-				ReleaseName:         config.ReleaseName,
-			},
-			OverrideValues: overrideValues,
-		})
-	}
-
-	s.log.Infof("Fetched %d store apps, [org: %s]", len(appsData), orgId)
-	return &serverpb.GetStoreAppsResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app config's are sucessfuly fetched from store",
-		Data:          appsData,
-	}, nil
-}
diff --git a/server/pkg/api/undeploy_store_app.go b/server/pkg/api/undeploy_store_app.go
deleted file mode 100644
index b8874be9..00000000
--- a/server/pkg/api/undeploy_store_app.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package api
-
-import (
-	"context"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) UnDeployStoreApp(ctx context.Context, request *serverpb.UnDeployStoreAppRequest) (
-	*serverpb.UnDeployStoreAppResponse, error) {
-
-	_, span := opentelemetry.GetTracer(request.ClusterID).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
-	span.SetAttributes(attribute.String("Release Name", request.ReleaseName))
-	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.ReleaseName)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.UnDeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-
-	s.log.Infof("UnDeploy store app %s request for cluster %s recieved, [org: %s]",
-		request.ReleaseName, request.ClusterID, orgId)
-
-	agent, err := s.agentHandeler.GetAgent(orgId, request.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to initialize agent, %v", err)
-		return &serverpb.UnDeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to undeploy the app",
-		}, nil
-	}
-
-	req := &agentpb.UnInstallAppRequest{
-		ReleaseName: request.ReleaseName,
-	}
-	resp, err := agent.GetClient().UnInstallApp(ctx, req)
-	if err != nil {
-		s.log.Errorf("failed to undeploy app, %v", err)
-		return &serverpb.UnDeployStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to undeploy the app",
-		}, nil
-	}
-
-	s.log.Infof("UnDeploy store app %s request request triggered for cluster %s, [org: %s]",
-		request.ReleaseName, request.ClusterID, orgId)
-
-	return &serverpb.UnDeployStoreAppResponse{
-		Status:        serverpb.StatusCode(resp.Status),
-		StatusMessage: resp.StatusMessage,
-	}, nil
-}
diff --git a/server/pkg/api/update_store_app.go b/server/pkg/api/update_store_app.go
deleted file mode 100644
index 5bed5ef8..00000000
--- a/server/pkg/api/update_store_app.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"github.com/kube-tarian/kad/server/pkg/types"
-	"go.opentelemetry.io/otel/attribute"
-)
-
-func (s *Server) UpdateStoreApp(ctx context.Context, request *serverpb.UpdateStoreAppRequest) (
-	*serverpb.UpdateStoreAppRsponse, error) {
-
-	_, span := opentelemetry.GetTracer(request.AppConfig.AppName).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("App Name", request.AppConfig.AppName))
-
-	_, err := validateOrgWithArgs(ctx, request.AppConfig.AppName, request.AppConfig.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.UpdateStoreAppRsponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-	s.log.Infof("Update store app [%s:%s] request recieved", request.AppConfig.AppName, request.AppConfig.Version)
-
-	//TODO check store app exist in DB
-	config := &types.StoreAppConfig{
-		ReleaseName:         request.AppConfig.ReleaseName,
-		AppName:             request.AppConfig.AppName,
-		Version:             request.AppConfig.Version,
-		Category:            request.AppConfig.Category,
-		Description:         request.AppConfig.Description,
-		ChartName:           request.AppConfig.ChartName,
-		RepoName:            request.AppConfig.RepoName,
-		RepoURL:             request.AppConfig.RepoURL,
-		Namespace:           request.AppConfig.Namespace,
-		CreateNamespace:     request.AppConfig.CreateNamespace,
-		PrivilegedNamespace: request.AppConfig.PrivilegedNamespace,
-		Icon:                hex.EncodeToString(request.AppConfig.Icon),
-		LaunchURL:           request.AppConfig.LaunchURL,
-		LaunchUIDescription: request.AppConfig.LaunchUIDescription,
-		OverrideValues:      request.AppValues.OverrideValues,
-		LaunchUIValues:      request.AppValues.LaunchUIValues,
-		TemplateValues:      request.AppValues.TemplateValues,
-	}
-
-	if err := s.serverStore.AddOrUpdateStoreApp(config); err != nil {
-		s.log.Errorf("failed to update app config in store, %v", err)
-		return &serverpb.UpdateStoreAppRsponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to update app config in store",
-		}, nil
-	}
-
-	s.log.Infof("Update store app [%s:%s] request successful", request.AppConfig.AppName, request.AppConfig.Version)
-	return &serverpb.UpdateStoreAppRsponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app config is sucessfuly updated",
-	}, nil
-}
diff --git a/server/pkg/api/upgrade_store_app.go b/server/pkg/api/upgrade_store_app.go
deleted file mode 100644
index 8e75291a..00000000
--- a/server/pkg/api/upgrade_store_app.go
+++ /dev/null
@@ -1,112 +0,0 @@
-package api
-
-import (
-	"context"
-	"encoding/hex"
-
-	"github.com/kube-tarian/kad/server/pkg/opentelemetry"
-	"github.com/kube-tarian/kad/server/pkg/pb/agentpb"
-	"github.com/kube-tarian/kad/server/pkg/pb/serverpb"
-	"go.opentelemetry.io/otel/attribute"
-	"gopkg.in/yaml.v2"
-)
-
-func (s *Server) UpgradeStoreApp(ctx context.Context, request *serverpb.UpgradeStoreAppRequest) (
-	*serverpb.UpgradeStoreAppResponse, error) {
-
-	_, span := opentelemetry.GetTracer(request.ClusterID).
-		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
-	defer span.End()
-
-	span.SetAttributes(attribute.String("Cluster ID", request.ClusterID))
-	span.SetAttributes(attribute.String("App Name", request.AppName))
-
-	orgId, err := validateOrgWithArgs(ctx, request.ClusterID, request.AppName, request.Version)
-	if err != nil {
-		s.log.Infof("request validation failed", err)
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INVALID_ARGUMENT,
-			StatusMessage: "request validation failed",
-		}, nil
-	}
-
-	s.log.Infof("Upgrade store app [%s:%s] request for cluster %s recieved, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-
-	config, err := s.serverStore.GetAppFromStore(request.AppName, request.Version)
-	if err != nil {
-		s.log.Errorf("failed to get store app values, %v", err)
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to find store app values",
-		}, nil
-	}
-
-	marshaledOverride, err := yaml.Marshal(config.OverrideValues)
-	if err != nil {
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to find store app values",
-		}, nil
-	}
-
-	marshaledLaunchUi, err := yaml.Marshal(config.LaunchUIValues)
-	if err != nil {
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to find store app values",
-		}, nil
-	}
-
-	decodedIconBytes, _ := hex.DecodeString(config.Icon)
-	req := &agentpb.UpgradeAppRequest{
-		AppConfig: &agentpb.AppConfig{
-			AppName:             config.Name,
-			Version:             config.Version,
-			ReleaseName:         config.ReleaseName,
-			Category:            config.Category,
-			Description:         config.Description,
-			ChartName:           config.ChartName,
-			RepoName:            config.RepoName,
-			RepoURL:             config.RepoURL,
-			Namespace:           config.Namespace,
-			CreateNamespace:     config.CreateNamespace,
-			PrivilegedNamespace: config.PrivilegedNamespace,
-			Icon:                decodedIconBytes,
-			LaunchURL:           config.LaunchURL,
-			LaunchUIDescription: config.LaunchUIDescription,
-			DefualtApp:          false,
-		},
-		AppValues: &agentpb.AppValues{
-			OverrideValues: request.OverrideValues,
-			LaunchUIValues: decodeBase64StringToBytes(string(marshaledLaunchUi)),
-			TemplateValues: decodeBase64StringToBytes(string(marshaledOverride)),
-		},
-	}
-
-	agent, err := s.agentHandeler.GetAgent(orgId, request.ClusterID)
-	if err != nil {
-		s.log.Errorf("failed to initialize agent, %v", err)
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to deploy the app",
-		}, nil
-	}
-
-	_, err = agent.GetClient().UpgradeApp(ctx, req)
-	if err != nil {
-		s.log.Errorf("failed to deploy app, %v", err)
-		return &serverpb.UpgradeStoreAppResponse{
-			Status:        serverpb.StatusCode_INTERNRAL_ERROR,
-			StatusMessage: "failed to deploy the app",
-		}, nil
-	}
-
-	s.log.Infof("Upgrade store app [%s:%s] request request triggered for cluster %s, [org: %s]",
-		request.AppName, request.Version, request.ClusterID, orgId)
-
-	return &serverpb.UpgradeStoreAppResponse{
-		Status:        serverpb.StatusCode_OK,
-		StatusMessage: "app is successfully deployed",
-	}, nil
-}

From cbc360d7b70339392610e5295324168cec5d69fa Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Wed, 8 May 2024 16:21:40 +0530
Subject: [PATCH 6/7] Updated the rpcs with opentelemetry

---
 server/go.mod                 | 7 -------
 server/pkg/api/get_cluster.go | 4 ++++
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/server/go.mod b/server/go.mod
index 295274d8..bfdd860d 100644
--- a/server/go.mod
+++ b/server/go.mod
@@ -5,10 +5,7 @@ go 1.21
 require (
 	github.com/go-git/go-git/v5 v5.11.0
 	github.com/gocql/gocql v1.3.1
-<<<<<<< HEAD
 	github.com/google/uuid v1.6.0
-=======
->>>>>>> main
 	github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1
 	github.com/intelops/go-common v1.0.20
 	github.com/kelseyhightower/envconfig v1.4.0
@@ -46,11 +43,7 @@ require (
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
-<<<<<<< HEAD
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
-=======
-	github.com/google/uuid v1.4.0 // indirect
->>>>>>> main
 	github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
diff --git a/server/pkg/api/get_cluster.go b/server/pkg/api/get_cluster.go
index 7f6d8e8f..27bf3de8 100644
--- a/server/pkg/api/get_cluster.go
+++ b/server/pkg/api/get_cluster.go
@@ -71,6 +71,10 @@ func (s *Server) GetClusterDetails(ctx context.Context, request *serverpb.GetClu
 
 func (s *Server) GetCluster(ctx context.Context, request *serverpb.GetClusterRequest) (
 	*serverpb.GetClusterResponse, error) {
+	_, span := opentelemetry.GetTracer("Get Cluster").
+		Start(opentelemetry.BuildContext(ctx), "CaptenServer")
+	defer span.End()
+
 	orgId, err := validateOrgWithArgs(ctx)
 	if err != nil {
 		s.log.Infof("request validation failed", err)

From 8fa5b0e8d8e3309c20b8e0424aaa46fdc0c7aa70 Mon Sep 17 00:00:00 2001
From: ShifnaZarnaz <shifna@intelops.dev>
Date: Tue, 14 May 2024 22:42:29 +0530
Subject: [PATCH 7/7] Instrumented opentelemetry in capten server

---
 server/cmd/server/main.go | 42 ++++++---------------------------------
 1 file changed, 6 insertions(+), 36 deletions(-)

diff --git a/server/cmd/server/main.go b/server/cmd/server/main.go
index 8898dee6..22d84830 100644
--- a/server/cmd/server/main.go
+++ b/server/cmd/server/main.go
@@ -95,38 +95,29 @@ func main() {
 		log.Fatal("failed to listen: ", err)
 	}
 
-	//grpc.NewServer(
-	//	grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()),
-	//	grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()))
-	// authInterceptor := grpc.UnaryInterceptor(rpcServer.AuthInterceptor)
-
 	var grpcServer *grpc.Server
 	if (cfg.OptelEnabled) && (cfg.AuthEnabled) {
 
-		log.Info("OPtel Enabled", cfg.OptelEnabled)
 		log.Info("Server Authentication and opentelemetry is enabled")
 
 		interceptor := CombineInterceptors(rpcServer.AuthInterceptor, otelgrpc.UnaryServerInterceptor())
 
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(interceptor))
 
-		// log.Info("Server Authentication disabled but opentelemetry instrumented")
-
-		// grpcServer = grpc.NewServer()
 	} else if cfg.OptelEnabled {
-		log.Info("OPtel Enabled", cfg.OptelEnabled)
-		log.Info("Opentelemetry is enabled")
+
+		log.Info("Opentelemetry is enabled and Server Authentication disabled")
 
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()))
 
 	} else if cfg.AuthEnabled {
-		log.Info("OPtel Enabled", cfg.OptelEnabled)
-		log.Info("Server Authentication enabled")
+
+		log.Info("Server Authentication enabled and opentelemetry disabled")
 
 		grpcServer = grpc.NewServer(grpc.UnaryInterceptor(rpcServer.AuthInterceptor))
 	} else {
-		log.Info("OPtel Enabled", cfg.OptelEnabled)
-		log.Info("Server Authentication disabled")
+
+		log.Info("Server Authentication and opentelemetry instrumentation disabled")
 
 		grpcServer = grpc.NewServer()
 	}
@@ -169,24 +160,3 @@ func chainedInterceptor(a grpc.UnaryServerInterceptor, b grpc.UnaryHandler) grpc
 		return a(ctx, req, nil, b)
 	}
 }
-
-// CombineInterceptors combines multiple unary interceptors into one
-// func CombineInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
-// 	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
-// 		// Chain the interceptors
-// 		chained := handler
-// 		for i := len(interceptors) - 1; i >= 0; i-- {
-// 			chained = chainedInterceptor(interceptors[i], info, chained)
-// 		}
-// 		// Call the combined interceptors
-// 		return chained(ctx, req)
-// 	}
-// }
-
-// // chainedInterceptor chains two unary interceptors together
-// func chainedInterceptor(a grpc.UnaryServerInterceptor, info *grpc.UnaryServerInfo, b grpc.UnaryHandler) grpc.UnaryHandler {
-// 	return func(ctx context.Context, req interface{}) (interface{}, error) {
-// 		// Call the first interceptor, passing the next handler as the next interceptor
-// 		return a(ctx, req, info, b)
-// 	}
-// }