Troubleshoot anomaly detection datafeed project scope
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 display counts that do not match the projects you expect.
Common symptoms include no results or origin-only results, slower extraction after linking projects, and job messages that reference a project alias that no longer exists.
Use these sources to gather diagnostic information:
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 API key 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-read: 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.
If extraction failures are ongoing, check Job messages first. remote_cluster_stats from get datafeed stats only updates after a cycle completes.
Open Machine Learning → Anomaly Detection and review the Project scope column. Each cell shows a parsed count out of the total project count (origin plus linked projects). For example, 2/5 means the expression targets 2 projects out of 5 available.
The parsed count comes from the routing expression text, not from which aliases match at runtime. To view the routing expression, open the job, go to the Datafeed tab, and check Project scope, or call GET _ml/datafeeds/{datafeed_id}.
A single wildcard expression like _alias:production-* shows 1, even if it matches several linked projects at runtime.
When the parsed count is lower than the number of projects named in the expression, your user might lack permission to view one or more linked projects. The column reflects what you can see, not every alias the expression could match.
During create, update, or extraction, job messages or the API can report one of these machine learning-enriched errors.
On create or update:
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 parenthesized cause vary with your configuration. The parenthesized 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.
| Situation | Typical behavior |
|---|---|
datafeed with empty project_routing and unqualified index patterns, with no linked projects |
Create or update can succeed. The first run-time search fails |
datafeed with unqualified index patterns and a _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 |
Qualified project:index references a project that does not exist or is unauthorized |
Fails immediately on create or update |
A project_routing value that matches nothing is deferred to run time only when every entry in indices is unqualified. Any qualified project:index pattern, including one whose project alias is missing, fails immediately on create or update.
Update routing to a valid _alias: expression, or link the missing project in Link and manage projects. Stop the datafeed and close the anomaly detection job before you update routing. For step-by-step guidance on setting scope in Kibana or through the API, see Change the project scope of an anomaly detection job.
- The Project scope column shows the intended parsed/total count.
GET _ml/datafeeds/{datafeed_id}returns the expectedproject_routingvalue.GET _ml/datafeeds/{datafeed_id}/_statsshows successful extraction cycles.
- 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.
Narrow project_routing to the projects you need. Stop the datafeed and close the anomaly detection job before you update. See Change the project scope of an anomaly detection job for how to set Project scope in Kibana or update routing through the API.
- The Project scope column shows the intended parsed/total count.
GET _ml/datafeeds/{datafeed_id}/_statsshowsremote_cluster_statslisting only the intended projects.- Extraction cycle duration returns to expected levels.
- 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.
When indices contains a qualified project:index pattern, update both project_routing and the qualified index reference after a rename or unlink. Stop the datafeed and close the anomaly detection job before you update. See Change the project scope of an anomaly detection job.
Changing indices also changes the cross-project search surface, which can re-key the internal cloud API key. See Cloud credential problems.
If the project should still be in scope, re-establish the link in Link and manage projects.
GET _ml/datafeeds/{datafeed_id}returns updatedproject_routingandindicesvalues.- Job messages no longer reference the stale alias.
GET _ml/datafeeds/{datafeed_id}/_statsshows successful extraction cycles.