Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions cmd/argocd-server/commands/argocd_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,10 +270,11 @@
lns, err := argocd.Listen()
errors.CheckError(err)
if otlpAddress != "" {
closer, err = traceutil.InitTracer(serverCtx, "argocd-server", otlpAddress, otlpInsecure, otlpHeaders, otlpAttrs)
if err != nil {
log.Fatalf("failed to initialize tracing: %v", err)
}
// closer, err = traceutil.InitTracer(serverCtx, "argocd-server", otlpAddress, otlpInsecure, otlpHeaders, otlpAttrs)
// if err != nil {
// log.Fatalf("failed to initialize tracing: %v", err)
// }
traceutil.InitGlobalTraceProvider(serverCtx)

Check failure on line 277 in cmd/argocd-server/commands/argocd_server.go

View workflow job for this annotation

GitHub Actions / Lint Go code

Error return value of `traceutil.InitGlobalTraceProvider` is not checked (errcheck)
}
argocd.Run(serverCtx, lns)
if closer != nil {
Expand Down
31 changes: 29 additions & 2 deletions server/application/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"time"

"github.com/argoproj/gitops-engine/pkg/health"
"go.opentelemetry.io/otel"

cacheutil "github.com/argoproj/argo-cd/v3/util/cache"

Expand Down Expand Up @@ -412,6 +413,9 @@ func (s *Server) queryRepoServer(ctx context.Context, proj *v1alpha1.AppProject,
enabledSourceTypes map[string]bool,
) error,
) error {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "queryRepoServer")
defer span.End()

closer, client, err := s.repoClientset.NewRepoServerClient()
if err != nil {
return fmt.Errorf("error creating repo server client: %w", err)
Expand Down Expand Up @@ -448,6 +452,9 @@ func (s *Server) queryRepoServer(ctx context.Context, proj *v1alpha1.AppProject,

// GetManifests returns application manifests
func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationManifestQuery) (*apiclient.ManifestResponse, error) {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "Server.GetManifests")
defer span.End()

if q.Name == nil || *q.Name == "" {
return nil, errors.New("invalid request: application name is missing")
}
Expand All @@ -474,12 +481,20 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan
return fmt.Errorf("error getting application cluster config: %w", err)
}

serverVersion, err := s.kubectl.GetServerVersion(config)
var ci v1alpha1.ClusterInfo
destCluster, err := argo.GetDestinationCluster(ctx, a.Spec.Destination, s.db)
if err != nil {
return fmt.Errorf("error getting server version: %w", err)
return fmt.Errorf("error getting destination cluster: %w", err)
}
getClusterInfoErr := s.cache.GetClusterInfo(destCluster.Server, &ci)
if getClusterInfoErr != nil {
return fmt.Errorf("error getting server version: %w", getClusterInfoErr)
}
serverVersion := ci.ServerVersion

_, kubectlSpan := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "kubectl.GetAPIResources")
apiResources, err := s.kubectl.GetAPIResources(config, false, kubecache.NewNoopSettings())
kubectlSpan.End()
if err != nil {
return fmt.Errorf("error getting API resources: %w", err)
}
Expand Down Expand Up @@ -1358,6 +1373,9 @@ func (s *Server) getCachedAppState(ctx context.Context, a *v1alpha1.Application,
}

func (s *Server) getAppResources(ctx context.Context, a *v1alpha1.Application) (*v1alpha1.ApplicationTree, error) {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "Server.getAppResources")
defer span.End()

var tree v1alpha1.ApplicationTree
err := s.getCachedAppState(ctx, a, func() error {
return s.cache.GetAppResourcesTree(a.InstanceName(s.ns), &tree)
Expand All @@ -1372,6 +1390,9 @@ func (s *Server) getAppResources(ctx context.Context, a *v1alpha1.Application) (
}

func (s *Server) getAppLiveResource(ctx context.Context, action string, q *application.ApplicationResourceRequest) (*v1alpha1.ResourceNode, *rest.Config, *v1alpha1.Application, error) {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "Server.getAppLiveResource")
defer span.End()

fineGrainedInheritanceDisabled, err := s.settingsMgr.ApplicationFineGrainedRBACInheritanceDisabled()
if err != nil {
return nil, nil, nil, err
Expand Down Expand Up @@ -1406,6 +1427,9 @@ func (s *Server) getAppLiveResource(ctx context.Context, action string, q *appli
}

func (s *Server) GetResource(ctx context.Context, q *application.ApplicationResourceRequest) (*application.ApplicationResourceResponse, error) {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "Server.GetResource")
defer span.End()

res, config, _, err := s.getAppLiveResource(ctx, rbac.ActionGet, q)
if err != nil {
return nil, err
Expand All @@ -1415,7 +1439,10 @@ func (s *Server) GetResource(ctx context.Context, q *application.ApplicationReso
if q.GetVersion() != "" {
res.Version = q.GetVersion()
}

_, kubectlSpan := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "kbuectl.GetResource")
obj, err := s.kubectl.GetResource(ctx, config, res.GroupKindVersion(), res.Name, res.Namespace)
kubectlSpan.End()
if err != nil {
return nil, fmt.Errorf("error getting resource: %w", err)
}
Expand Down
14 changes: 14 additions & 0 deletions server/application/application_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,13 @@ func newTestAppServerWithEnforcerConfigure(t *testing.T, f func(*rbac.Enforcer),
}
appCache := servercache.NewCache(appStateCache, time.Hour, time.Hour, time.Hour)

// Seed cluster info so server version lookup in GetManifests succeeds

require.NoError(t, appCache.SetClusterInfo(
fakeCluster().Server,
&v1alpha1.ClusterInfo{ServerVersion: "v1.27.0"},
))

kubectl := &kubetest.MockKubectlCmd{}
kubectl = kubectl.WithGetResourceFunc(func(_ context.Context, _ *rest.Config, gvk schema.GroupVersionKind, name string, namespace string) (*unstructured.Unstructured, error) {
for _, obj := range objects {
Expand Down Expand Up @@ -450,6 +457,13 @@ func newTestAppServerWithEnforcerConfigureWithBenchmark(b *testing.B, f func(*rb
}
appCache := servercache.NewCache(appStateCache, time.Hour, time.Hour, time.Hour)

// Seed cluster info so server version lookup in GetManifests succeeds

require.NoError(b, appCache.SetClusterInfo(
fakeCluster().Server,
&v1alpha1.ClusterInfo{ServerVersion: "v1.27.0"},
))

kubectl := &kubetest.MockKubectlCmd{}
kubectl = kubectl.WithGetResourceFunc(func(_ context.Context, _ *rest.Config, gvk schema.GroupVersionKind, name string, namespace string) (*unstructured.Unstructured, error) {
for _, obj := range objects {
Expand Down
4 changes: 4 additions & 0 deletions util/argo/argo.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/argoproj/gitops-engine/pkg/utils/kube"
"github.com/r3labs/diff/v3"
log "github.com/sirupsen/logrus"
"go.opentelemetry.io/otel"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -457,6 +458,9 @@ func validateRepo(ctx context.Context,
// This function also validates the references use allowed characters and does not define the same ref key more than
// once (which would lead to ambiguous references).
func GetRefSources(ctx context.Context, sources argoappv1.ApplicationSources, project string, getRepository func(ctx context.Context, url string, project string) (*argoappv1.Repository, error), revisions []string, isRollback bool) (argoappv1.RefTargetRevisionMapping, error) {
ctx, span := otel.GetTracerProvider().Tracer("argocd-server").Start(ctx, "GetRefSources")
defer span.End()

refSources := make(argoappv1.RefTargetRevisionMapping)
if len(sources) > 1 {
// Validate first to avoid unnecessary DB calls.
Expand Down
25 changes: 25 additions & 0 deletions util/trace/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,28 @@ func InitTracer(ctx context.Context, serviceName, otlpAddress string, otlpInsecu
}
}, nil
}

func InitGlobalTraceProvider(ctx context.Context) (func(), error) {
exporter, err := otlptracegrpc.New(ctx)
if err != nil {
return nil, err
}

tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(semconv.SchemaURL, semconv.ServiceNameKey.String("argocd-server"))),
)

// set the global tracer provider
otel.SetTracerProvider(tp)
// set the global propagator to use TraceContext and Baggage
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
))
return func() {
if err := exporter.Shutdown(ctx); err != nil {
log.Errorf("failed to stop exporter: %v", err)
}
}, nil
}
Loading