Project scope problems
§§§§§§§§§§§§§§§§§§§§§§§--- navigation_title: Project scope problems applies_to: stack: unavailable serverless: preview products:
- id: elasticsearch
- id: cloud-serverless
- id: machine-learning
The project_routing field decides which linked projects a cross-project search datafeed searches. This page covers routing that matches nothing, routing that matches too many projects, references to projects that no longer exist under an alias, and clones that inherit the source anomaly detection job's scope.
Where to look
anomaly detection job job messages in Kibana: Open Machine Learning → Anomaly Detection, select the job, and review the Job messages tab for audit entries and warnings about linked projects, credentials, or scope changes. On the Datafeed tab, View datafeed counts opens the datafeed chart flyout for extraction timing.
The same entries are stored in
.ml-notifications-*.GET _ml/datafeeds/{datafeed_id}: Shows the effectiveproject_routingvalue and, when an internal cloud credential exists,authorization.cloud_api_key.id.GET _ml/datafeeds/{datafeed_id}/_stats: While the datafeed runs, showsremote_cluster_statswithtotal_clusters,available_clusters,skipped_clusters,availability_ratio,stabilized_cluster_aliases, andper_cluster_consecutive_skips. The object is absent until the first search cycle establishes a baseline..ml-annotations-*: Scope-change annotations for the job. The annotationeventfield carriessearch_scope_changed(not the separatetypefield).GET /_project/tags: Lists linked projects and their tags so you can compare them with a routing expression.Elastic Cloud console: Review linked projects in Link and manage projects.
During active extraction problems, Job messages are authoritative. remote_cluster_stats from get datafeed stats reflects the last completed cycle.
Check the effective scope in Kibana
Open Machine Learning → Anomaly Detection and review the Project scope column in the anomaly detection jobs list. Each cell shows a parsed/total count (for example, 2/5) derived from the stored routing expression and the total project count (origin plus linked projects), not from live resolution of which aliases match. Kibana parses the segment after _alias:: omitted or null routing shows 1. _alias:* shows the origin-plus-linked total. A single expression such as _alias:production-* or _alias:_origin shows 1. Because the count comes from parsing rather than resolution, a wildcard that matches several projects still shows 1. Select the count to open a popover titled Project scope that displays the routing expression stored on the datafeed. A legacy anomaly detection job with no stored routing shows _alias:_origin in the popover.
Error messages: routing matches no project
During create, update, or extraction, Job messages or the API can report one of these machine learning-enriched errors:
On create or update (validate-before-mint):
Create failures use the same Cannot update datafeed wording even though the request is a put.
Cannot update datafeed [my-datafeed]: project_routing [_alias:nonexistent-*] matched no linked project (no matching project after applying project routing [_alias:nonexistent-*]). Link the missing project in Elastic Cloud project settings, or update project_routing to a valid linked alias (for example _origin for local-only scope).
During extraction or preview:
Datafeed [my-datafeed] cannot search any project: project_routing [_alias:nonexistent-*] matched no linked projects at run time (no matching project after applying project routing [_alias:nonexistent-*]). Link the missing project(s) in Elastic Cloud project settings, or update project_routing to an expression that matches at least one linked project (for example _origin for local-only scope).
The bracketed datafeed id, routing expression, and parenthesised cause vary with your configuration. The parenthesised text comes from Elasticsearch itself, typically in one of these forms:
no matching project after applying project routing [_alias:nonexistent-*]
No such project: [missing-project] with project routing [_alias:production-*]
The suggested _origin example in the machine learning messages is not a valid routing value. Use _alias:_origin for origin-project-only scope instead. See Project routing in CPS.
When each failure happens
| Situation | Typical behavior |
|---|---|
Flat-world datafeed (empty project_routing, unqualified index patterns) with no linked projects |
Create or update can succeed. The first run-time search fails |
Flat-world datafeed (unqualified index patterns) with _alias: expression that matches no linked tags, including typos |
Create or update can succeed. The first run-time search fails |
datafeed with qualified project:index patterns and project_routing that matches no linked tags |
Fails immediately on create or update (validate-before-mint) |
Qualified project:index references a project that does not exist or is unauthorized |
Fails immediately on create or update |
Validate-before-mint defers a no-match project_routing to run time only when every entry in indices is unqualified (flat-world). Any qualified project:index pattern, including one whose project alias is missing, fails immediately on create or update.
Scope is wider than intended
- datafeed extraction cycles take noticeably longer after new projects were linked.
GET _ml/datafeeds/{datafeed_id}/_statsshowsremote_cluster_statsfanning out to many linked projects you do not need.project_routingis empty, omitted, or uses a wide expression such as_alias:*that matches most linked aliases.- The anomaly detection job was created without an explicit routing expression and now searches all linked projects by default.
Stale project reference
- Job messages or extraction errors reference a project alias that no longer appears in
GET /_project/tagsor the Cloud console linked-project list. project_routingstill contains an_alias:tag that matched a project before it was renamed or unlinked.- A qualified index pattern such as
old-alias:logs-*names a project alias that is no longer linked.
Cloned job searches unexpected projects
- A cloned anomaly detection job searches more linked projects than intended.
GET _ml/datafeeds/{datafeed_id}on the clone shows the sameproject_routingas the source datafeed.- Cloning reuses the job-creation wizard, which copies the source datafeed configuration (including
project_routing) into the new job before you confirm create.
Stop the datafeed before updating it. If the datafeed is still running, the update fails with:
Cannot update datafeed [my-datafeed] while its status is started
The bracketed datafeed id and status vary with your configuration.
When a project_routing update changes the effective search scope, Elasticsearch retains the job's current model snapshot as a rollback point before applying the change. By default, that rollback gate requires the anomaly detection job to be closed. If the job is still open, the update fails with:
Cannot update project_routing for datafeed [my-datafeed] while job [my-job] is opened. Close the job so a rollback model snapshot can be retained.
The bracketed datafeed id, job id, and job state vary with your configuration.
The rollback gate also requires an existing model snapshot. If the job has never produced one, the update fails with:
Cannot update project_routing for datafeed [my-datafeed] because job [my-job] has no model snapshot to use as a rollback point. Open the job, ingest data, then close it before changing scope.
A job that has never run has no snapshot. Open it, let it process data, then close it before changing project scope.
Elasticsearch records the retained rollback snapshot in the job's Job messages (or .ml-notifications-*), for example:
Rollback model snapshot [1720000000] retained before project_routing scope change: Automatic rollback snapshot retained before project_routing scope change [] -> [_alias:prod-*]
When the datafeed already had a stored routing value, the bracketed pair shows the old and new expressions instead of an empty left side:
Rollback model snapshot [1720000000] retained before project_routing scope change: Automatic rollback snapshot retained before project_routing scope change [_alias:_origin] -> [_alias:prod-*]
You can revert to that snapshot if detection quality degrades after a scope change.
Exception: assigning _alias:_origin for the first time to a datafeed that had no project_routing preserves the existing local-only scope. That update bypasses the rollback gate entirely. Neither the closed-job check nor the snapshot requirement applies.
Correct the routing expression
Update routing to a valid _alias: expression:
POST _ml/datafeeds/{datafeed_id}/_update
{
"project_routing": "_alias:production-*"
}
Narrow to the origin project
When you only need data from the local project, set origin-project-only routing:
POST _ml/datafeeds/{datafeed_id}/_update
{
"project_routing": "_alias:_origin"
}
Link a missing project
If routing references a project that should be in scope, establish the link in Link and manage projects, then update routing or wait for the next extraction cycle.
Fix a stale qualified index
When indices contains a qualified project:index pattern, update both project_routing and the qualified index reference after a rename or unlink:
POST _ml/datafeeds/{datafeed_id}/_update
{
"project_routing": "_alias:production-*",
"indices": ["new-alias:logs-*"]
}
Changing indices also changes the cross-project search surface, which can re-key the internal cloud credential. See Cloud credential problems.
Set scope when creating or cloning a job
When creating or cloning a job in Kibana, set Project scope before you finish the wizard:
- On Select data view or saved Discover session, use the Project scope control to pick routing before you choose the data source.
- On later wizard steps (including the datafeed step), the Project scope section shows the label Project scope with the description Select the project routing for the job. Adjust routing there if the clone inherited a broader scope than you need.
Verify
Confirm recovery in three places:
- The Project scope column shows the intended parsed/total count and popover expression.
GET _ml/datafeeds/{datafeed_id}returns the expectedproject_routingvalue.GET _ml/datafeeds/{datafeed_id}/_statsshows successful extraction cycles andremote_cluster_statslisting only the intended projects.