{"record":{"id":"1fa2c1f3fb9677a0","repo":"apache/beam","slug":"failed-to-get-metrics-execute","errorCode":null,"errorMessage":"failed to get metrics","messagePattern":"failed to get metrics","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"sdks/go/pkg/beam/runners/universal/runnerlib/execute.go","lineNumber":155,"sourceCode":"\t\tPath:   worker,\n\t\tSha256: hash,\n\t})\n\tif err := graphx.UpdateDefaultEnvWorkerType(graphx.URNArtifactFileType, pyld, p); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\ntype universalPipelineResult struct {\n\tjobID   string\n\tmetrics *metrics.Results\n}\n\nfunc newUniversalPipelineResult(ctx context.Context, jobID string, client jobpb.JobServiceClient, p *pipepb.Pipeline) (*universalPipelineResult, error) {\n\trequest := &jobpb.GetJobMetricsRequest{JobId: jobID}\n\tresponse, err := client.GetJobMetrics(ctx, request)\n\tif err != nil {\n\t\treturn &universalPipelineResult{jobID, nil}, errors.Wrap(err, \"failed to get metrics\")\n\t}\n\n\tmonitoredStates := response.GetMetrics()\n\tmetrics := metricsx.FromMonitoringInfos(p, monitoredStates.Attempted, monitoredStates.Committed)\n\treturn &universalPipelineResult{jobID, metrics}, nil\n}\n\nfunc (pr universalPipelineResult) Metrics() metrics.Results {\n\treturn *pr.metrics\n}\n\nfunc (pr universalPipelineResult) JobID() string {\n\treturn pr.jobID\n}\n","sourceCodeStart":137,"sourceCodeEnd":170,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/runners/universal/runnerlib/execute.go#L137-L170","documentation":"newUniversalPipelineResult fetches a completed job's metrics from the runner's JobService via gRPC GetJobMetrics. If that RPC fails, the error is wrapped as \"failed to get metrics\" and returned with an empty metrics result. The pipeline ran, but its counters/monitoring info could not be retrieved.","triggerScenarios":"client.GetJobMetrics returns a transport or server error while constructing the universal pipeline result after WaitForCompletion, called from Execute.","commonSituations":"Runner service restarted or unreachable after job completion; network interruption between client and runner; job purged immediately after completion so metrics are unavailable; gRPC deadline exceeded.","solutions":["Retry the job results fetch — the job may have succeeded even though metrics retrieval failed.","Check connectivity/endpoint to the runner's job service (host, port, TLS).","Verify the job still exists on the runner (it may have been garbage-collected).","Increase the gRPC/context timeout used when creating the pipeline result."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Go: probe the job service before/after the run\nconn, err := grpc.Dial(endpoint, grpc.WithInsecure())\nif err != nil { /* endpoint unreachable; fix config first */ }","typeGuard":null,"tryCatchPattern":"res, err := beam.Run(ctx, runner, p)\nif err != nil && strings.Contains(err.Error(), \"failed to get metrics\") {\n    // job likely succeeded; retry fetching metrics or treat as non-fatal\n}","preventionTips":["Treat metrics retrieval failure as non-fatal if the job itself completed.","Verify runner endpoint/TLS before submitting.","Increase context timeouts for large jobs whose metrics fetch may be slow.","Ensure the runner doesn't purge jobs before metrics are fetched."],"tags":["go","beam","grpc","metrics"],"backgroundTag":"api-request-failed","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}