{"record":{"id":"961063c82b6d1f74","repo":"apache/beam","slug":"found-v-uses-of-features-unimplemented-in-prism-in-job-v-v","errorCode":null,"errorMessage":"found %v uses of features unimplemented in prism in job %v:\n%v","messagePattern":"found (.+?) uses of features unimplemented in prism in job (.+?):\n(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/runners/prism/internal/jobservices/management.go","lineNumber":303,"sourceCode":"\t\t} else if hasStatefulTriggers(ws.GetTrigger()) {\n\t\t\t// Technically for any merging windows, but per the above, we only support session windows presently.\n\t\t\tcheck(\"WindowingStrategy: Using stateful triggers with merging windows isn't currently supported in prism. See https://github.com/apache/beam/issues/31438 for information.\", prototext.Format(ws))\n\t\t}\n\t\tcheck(\"WindowingStrategy.OnTimeBehavior\", ws.GetOnTimeBehavior(), pipepb.OnTimeBehavior_FIRE_IF_NONEMPTY, pipepb.OnTimeBehavior_FIRE_ALWAYS)\n\n\t\t// Allow earliest and latest in pane to unblock running python tasks.\n\t\t// Tests actually using the set behavior will fail.\n\t\tcheck(\"WindowingStrategy.OutputTime\", ws.GetOutputTime(), pipepb.OutputTime_END_OF_WINDOW,\n\t\t\tpipepb.OutputTime_EARLIEST_IN_PANE, pipepb.OutputTime_LATEST_IN_PANE)\n\n\t\tif hasUnsupportedTriggers(ws.GetTrigger()) {\n\t\t\tcheck(\"WindowingStrategy.Trigger\", ws.GetTrigger().String())\n\t\t}\n\t}\n\tif len(errs) > 0 {\n\t\tjErr := &joinError{errs: errs}\n\t\tslog.Error(\"unable to run job\", slog.String(\"cause\", \"unimplemented features\"), slog.String(\"jobname\", req.GetJobName()), slog.String(\"errors\", jErr.Error()))\n\t\terr := fmt.Errorf(\"found %v uses of features unimplemented in prism in job %v:\\n%v\", len(errs), req.GetJobName(), jErr)\n\t\tjob.Failed(err)\n\t\treturn nil, err\n\t}\n\treturn &jobpb.PrepareJobResponse{\n\t\tPreparationId:       job.key,\n\t\tStagingSessionToken: job.key,\n\t\tArtifactStagingEndpoint: &pipepb.ApiServiceDescriptor{\n\t\t\tUrl: s.Endpoint(),\n\t\t},\n\t}, nil\n}\n\nfunc hasUnsupportedTriggers(tpb *pipepb.Trigger) bool {\n\tif tpb == nil {\n\t\treturn false\n\t}\n\n\tunsupported := false","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/runners/prism/internal/jobservices/management.go#L285-L321","documentation":"During Prepare, Prism collects a list of pipeline features it does not implement (via the check() helper, e.g. triggered side inputs). If any were found, it aggregates them into a joinError and rejects the job with this message listing each unimplemented feature. The job is marked Failed and never runs.","triggerScenarios":"Submitting a pipeline whose WindowingStrategy triggers, side inputs (e.g. unbounded global window triggered side inputs), or other transforms hit a check() failure inside Prepare — any single unimplemented feature produces this aggregate error.","commonSituations":"Porting a Flink/Spark/Direct-runner pipeline to prism that relies on windowing features prism lacks (e.g. side inputs ready mid-window, exotic triggers); using TestStream windows+late data semantics prism doesn't support.","solutions":["Read the listed %v entries to identify each unimplemented feature and remove or restructure it in the pipeline.","Replace triggered side inputs on unbounded global windows with plain side inputs or window-agnostic lookups.","Run the pipeline on a runner that supports the feature (DirectRunner, Flink) instead of prism.","Check github.com/apache/beam issues (e.g. #31438) for the feature's prism support status before porting."],"exampleFix":"// before\nw := window.NewTriggeredFixedWindows(window.NewTrigger(...), ...)\nbeam.ParDo(s, sideInputDoFn, w) // prism: unsupported\n\n// after\nw := window.NewFixedWindows(...) // no exotic trigger\nbeam.ParDo(s, sideInputDoFn, w)","handlingStrategy":"validation","validationCode":"// Pre-check windowing strategy before submitting to prism\nif ws.GetTrigger() != nil && usesSideInputs(pipeline) {\n    return errors.New(\"pipeline uses triggered side inputs unsupported by prism\")\n}","typeGuard":null,"tryCatchPattern":"err := runner.Prepare(req)\nif err != nil && strings.Contains(err.Error(), \"unimplemented in prism\") {\n    for _, line := range strings.Split(err.Error(), \"\\n\")[1:] {\n        log.Printf(\"unsupported feature: %s\", line) // migrate each feature\n    }\n}","preventionTips":["Audit windowing/triggers and side-input usage against prism's supported feature list before porting.","Prefer simple fixed/session windows and non-triggered side inputs on prism.","Check linked Beam issues (e.g. #31438) for feature support status.","Validate the pipeline on the DirectRunner and only then move to prism."],"tags":["go","beam-prism","unsupported-feature","validation"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}