Skip to main content

Confirm story points are being read

You do not normally need to configure the field ids. Prism discovers them from Jira's own /rest/api/2/field registry on every run: it collects every field whose name is "Story Points" or "Story Point Estimate", then every field whose name merely contains "story point", and treats them as an ordered candidate list — coalescing per issue, first non-null wins. That design is deliberate, because on a large Jira each project configures its own fields and several story-point customfields coexist with different projects populating different ones. The sprint field is discovered the same way.

So the task here is not to find the ids. It is to confirm the discovery found something, because the failure is quiet: with no story-points field, the ingest succeeds, issues arrive, every point lands null, and nothing errors. Question counts stay right while anything about points is silently empty.

Two places tell you, and neither needs Jira access:

kubectl logs -n <namespace> -l app.kubernetes.io/component=jira-ingest | head -3

The first lines name the deployment, the candidate list and the sprint field:

jira ingest: Server @ https://jira.example.com | points candidates=['customfield_10004'] sprint=customfield_10007

An empty list is called out on its own line — WARNING: no story-points fields found — and the same finding reaches the self test through the upstream probe as no_story_points_field_found, a warning rather than a failure for the reason above: the source is degraded, not broken.

A matching name is not the same as the right field​

Discovery matches on the field's name, and on a large instance more than one name matches while only one of them holds this issue's story points. Two shapes turn up repeatedly, and both are wrong in the same direction:

fieldwhat it actually iswhat it does to your figures
Total Story Pointsa rollup onto the epicwhere the epic has it and Story Points is null, the epic records its children's aggregate as its own — and Prism ingests those children too, so every sum counts them twice
Original story pointsthe estimate before re-pointingthe wrong number by construction for "what did this team deliver", and indistinguishable from the right one once it is in the column

Neither shows up as an error. The issue counts stay right, the points column stays populated, and only the arithmetic is wrong. So on an instance with more than one match, check which fields discovery found before trusting the numbers — and if the extras are wrong rather than merely redundant, name the right one explicitly below.

To override discovery, set ingest.jira.storyPointsField to a comma list of customfield_NNNNN ids. It replaces the discovered list rather than being added to it — the ids you name are the only ones that count, in the order you write them, and nothing discovered can supply a value behind them. That is the lever for the case above.

Changed in 0.9.0 (#602). It used to be prepended, which sounds like a stronger version of the same thing and is not: every discovered field stayed in the chain and supplied a value wherever the ids ahead of it were null. On an instance whose exact match already sorted first, setting the override changed nothing at all.

Leave it empty and discovery behaves exactly as described above, which is the normal case.

To read the ids off Jira yourself:

curl -sS -H "Authorization: Bearer <PAT>" "<your Jira base URL>/rest/api/2/field" \
| grep -io '"id":"[^"]*","key[^}]*story point[^}]*'

If points are still null with a candidate list present, the likeliest cause is that the issues in the window simply have no points on them — check one in Jira before raising it.

And to answer "did the wrong field supply them?" — the question the table above raises — Admin → Context streams records points_field_by_project: which field supplied points for which project, as a count. A project whose points all came from a field you did not expect is visible there and nowhere else, so it is worth a look on the first run after go-live rather than only when a figure looks wrong. A project whose points never arrive at all is visible there too.

The upstream probe reports the same thing before any ingest has run: story_points_candidates is the chain the ingest will coalesce over, story_points_discovered is what discovery found regardless of your override — so an override that names the wrong id is visible as the difference between them.