Skip to content
Draft
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
39 changes: 36 additions & 3 deletions pkg/services/orgresolver/linking.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"

"go.opentelemetry.io/otel/metric"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
Expand Down Expand Up @@ -33,6 +34,9 @@ type Config struct {
WorkflowRegistryAddress string
WorkflowRegistryChainSelector uint64
JWTGenerator JWTGenerator

Client linkingclient.LinkingServiceClient // optional
Meter metric.Meter // optional
}

// orgResolver makes direct calls to the linking service to resolve organization IDs from workflow owners.
Expand All @@ -45,24 +49,34 @@ type orgResolver struct {
conn *grpc.ClientConn // nil if client was injected
logger log.SugaredLogger
jwtGenerator JWTGenerator

passCount metric.Int64Counter
failCount metric.Int64Counter
}

// NewOrgResolver creates a new org resolver with the specified configuration
// Deprecated: Use Config.New
func NewOrgResolver(cfg Config, logger log.Logger) (*orgResolver, error) {
return NewOrgResolverWithClient(cfg, nil, logger)
return cfg.New(logger)
}

// NewOrgResolverWithClient creates a new org resolver with an optional injected client (for testing)
// Deprecated: Use Config.New
func NewOrgResolverWithClient(cfg Config, client linkingclient.LinkingServiceClient, logger log.Logger) (*orgResolver, error) {
cfg.Client = client
return cfg.New(logger)
}

func (cfg *Config) New(logger log.Logger) (*orgResolver, error) {
resolver := &orgResolver{
workflowRegistryAddress: cfg.WorkflowRegistryAddress,
workflowRegistryChainSelector: cfg.WorkflowRegistryChainSelector,
logger: log.Sugared(logger).Named("OrgResolver"),
jwtGenerator: cfg.JWTGenerator,
}

if client != nil {
resolver.client = client
if cfg.Client != nil {
resolver.client = cfg.Client
} else {
if cfg.URL == "" {
return nil, errors.New("URL is required when client is not provided")
Expand All @@ -84,6 +98,19 @@ func NewOrgResolverWithClient(cfg Config, client linkingclient.LinkingServiceCli
resolver.client = linkingclient.NewLinkingServiceClient(conn)
}

if cfg.Meter != nil {
var err error
//TODO names
resolver.passCount, err = cfg.Meter.Int64Counter("foo.bar.TODO.pass")
if err != nil {
return nil, fmt.Errorf("failed to create pass count metric: %w", err)
}
resolver.failCount, err = cfg.Meter.Int64Counter("foo.bar.TODO.fail")
if err != nil {
return nil, fmt.Errorf("failed to create fail count metric: %w", err)
}
}

return resolver, nil
}

Expand Down Expand Up @@ -119,9 +146,15 @@ func (o *orgResolver) Get(ctx context.Context, owner string) (string, error) {

resp, err := o.client.GetOrganizationFromWorkflowOwner(ctx, req)
if err != nil {
if o.failCount != nil {
o.failCount.Add(ctx, 1) //TODO owner attribute?
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are owner attributes helpful? Or just noise with extra cardinality?

}
return "", fmt.Errorf("failed to fetch organization from workflow owner: %w", err)
}

if o.passCount != nil {
o.passCount.Add(ctx, 1) //TODO owner attribute?
}
return resp.OrganizationId, nil
}

Expand Down
Loading