{"record":{"id":"c13df3147f840dd1","repo":"argoproj/argo-workflows","slug":"failed-to-dial-plugin-s-at-q-w","errorCode":null,"errorMessage":"failed to dial plugin %s at %q: %w","messagePattern":"failed to dial plugin (.+?) at %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"workflow/artifacts/plugin/plugin.go","lineNumber":105,"sourceCode":"\t\t\"mode\":       info.Mode(),\n\t}).Info(ctx, \"plugin socket file exists and is a unix socket\")\n\n\tconn, err := grpc.NewClient(\n\t\t\"unix://\"+socketPath,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),\n\t\tgrpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) {\n\t\t\t// Strip unix:// prefix if present\n\t\t\tif len(addr) > 7 && addr[:7] == \"unix://\" {\n\t\t\t\taddr = addr[7:]\n\t\t\t}\n\t\t\tdialer := &net.Dialer{Timeout: connectionTimeout}\n\t\t\treturn dialer.DialContext(ctx, \"unix\", addr)\n\t\t}),\n\t\t// Add OpenTelemetry tracing for gRPC calls\n\t\tgrpc.WithStatsHandler(otelgrpc.NewClientHandler()),\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to dial plugin %s at %q: %w\", pluginName, socketPath, err)\n\t}\n\n\tdriver := &Driver{\n\t\tpluginName: pluginName,\n\t\tconn:       conn,\n\t\tclient:     artifact.NewArtifactServiceClient(conn),\n\t}\n\n\t// Verify the connection by checking the connection state\n\tctx, cancel := context.WithTimeout(ctx, connectionTimeout)\n\tdefer cancel()\n\n\tconn.Connect()\n\n\t// Wait for the connection to reach Ready state within the timeout\n\tfor state := conn.GetState(); state != connectivity.Ready; state = conn.GetState() {\n\t\tif state == connectivity.Shutdown {\n\t\t\t_ = conn.Close()","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/workflow/artifacts/plugin/plugin.go#L87-L123","documentation":"grpc.NewClient failed to construct the gRPC client connection for the plugin's unix socket. This is a client-construction error (e.g. invalid target URL scheme or options), not a network failure — dialing is lazy in modern grpc-go.","triggerScenarios":"grpc.NewClient returns an error for the target \"unix://<socketPath>\" — typically a malformed target string (e.g. socketPath containing characters that break the unix:// URL, or an empty path) or invalid dial options.","commonSituations":"Empty or whitespace socketPath coming from plugin configuration, socketPath already containing a scheme prefix producing \"unix://unix://...\", or a misconfigured resolver target.","solutions":["Print/inspect the socketPath being passed to NewDriver; ensure it is an absolute filesystem path with no scheme prefix","Remove any 'unix://' prefix from the configured path — NewDriver adds it itself","Ensure socketPath is non-empty and a valid absolute POSIX path","If caused by dial options (e.g. credentials), check that no conflicting grpc options were introduced by a version upgrade"],"exampleFix":"// before\nsocketPath: \"unix:///var/run/argo/plugins/myplug.sock\"\n// after\nsocketPath: \"/var/run/argo/plugins/myplug.sock\"","handlingStrategy":"validation","validationCode":"if socketPath == \"\" || !filepath.IsAbs(socketPath) || strings.Contains(socketPath, \"://\") {\n    return fmt.Errorf(\"invalid plugin socketPath %q: must be an absolute path with no scheme\", socketPath)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Store the socket path without any 'unix://' scheme — NewDriver adds it","Fail fast at config-load time if the path is empty or relative","Add a unit test round-tripping every configured plugin name to a validated socket path"],"tags":["grpc","configuration","unix-socket","plugin-driver"],"backgroundTag":"grpc-dial-failed","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}