Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fleet] Create intermediate objects when using dynamic mappings #169981

Merged
merged 13 commits into from
Nov 6, 2023

Conversation

jsoriano
Copy link
Member

@jsoriano jsoriano commented Oct 26, 2023

Summary

For dynamic: "runtime", and possibly other configurations different to dynamic: true, intermediate objects need to exist for dynamic mappings, otherwise ingestion can fail with Missing intermediate object ....

This pull request includes these intermediate objects, and avoids the creation of static properties with wildcards, that is probably not what is expected for these mappings.

Intermediate objects are included as static properties for parts of the name before the wildcard, and as dynamic templates when the full path has wildcards.

In the modified test files are examples of any of these.

This is more an issue since the following recent fixes, that create the actual dynamic mappings for some cases where only empty objects were created before.

This attempts to unblock elastic/apm-server#11822.

Checklist

Risk Matrix

Delete this section if it is not applicable to this PR.

Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release.

When forming the risk matrix, consider some of the following examples and how they may potentially impact the change:

Risk Probability Severity Mitigation/Notes
Unexpected collateral effects on unrelated package templates Medium High This change does significant changes in how some templates are generated, this may be a risk for some packages that make extensive use of dynamic mappings.

@jsoriano jsoriano self-assigned this Oct 26, 2023
@apmmachine
Copy link
Contributor

🤖 GitHub comments

Expand to view the GitHub comments

Just comment with:

  • /oblt-deploy : Deploy a Kibana instance using the Observability test environments.
  • /oblt-deploy-serverless : Deploy a serverless Kibana instance using the Observability test environments.
  • run elasticsearch-ci/docs : Re-trigger the docs validation. (use unformatted text in the comment!)

labels: {
type: "object",
dynamic: true,
},
Copy link
Member Author

@jsoriano jsoriano Oct 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example of intermediary object that is created as static property for dynamic templates.

dynamic: true,
},
},
},
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example of intermediary objects created using dynamic mappings, as they contain dynamic parts.

@jsoriano jsoriano requested a review from kyungeunni October 27, 2023 17:31
@jsoriano jsoriano changed the title [Fleet] Create intermediary objects when using dynamic mappings [Fleet] Create intermediate objects when using dynamic mappings Oct 27, 2023
@jsoriano jsoriano marked this pull request as ready for review November 1, 2023 18:57
@jsoriano jsoriano requested a review from a team as a code owner November 1, 2023 18:57
@jsoriano
Copy link
Member Author

jsoriano commented Nov 2, 2023

@elasticmachine merge upstream

@botelastic botelastic bot added the Team:Fleet Team label for Observability Data Collection Fleet team label Nov 2, 2023
@elasticmachine
Copy link
Contributor

Pinging @elastic/fleet (Team:Fleet)

@kibana-ci
Copy link
Collaborator

💛 Build succeeded, but was flaky

Failed CI Steps

Metrics [docs]

✅ unchanged

History

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

cc @jsoriano

Copy link
Contributor

@juliaElastic juliaElastic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link

@kyungeunni kyungeunni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can confirm that intermediate objects are generated in the mappings so thus apmpackage can be installed with the correct index templates thanks to this change.

Thank you so much for fixing this, @jsoriano !

@jsoriano jsoriano merged commit d398606 into elastic:main Nov 6, 2023
2 checks passed
@jsoriano jsoriano deleted the fleet-create-object-dynamic-mappings branch November 6, 2023 16:25
@kibanamachine kibanamachine added v8.12.0 backport:skip This commit does not require backporting labels Nov 6, 2023
jsoriano added a commit that referenced this pull request Jan 31, 2024
…jects (#175970)

When there are multiple dynamic templates with the same name, we only
use the first appearance.
Add an exception for intermediate objects, so we use the last
appearance. This way we avoid that less specific dynamic templates
created for intermediate objects match before more specific dynamic
templates defined in packages.

This was a problem for example in the Prometheus package, where there
are definitions for `prometheus.*.value` and `prometheus.*.histogram`.
For both cases Fleet tries to create a dynamic template for the
intermediate objects `prometheus.*`. If this dynamic template is
inserted before the dynamic template for the histograms, it matches for
them, causing mapping errors on ingestion, like the following one:
```
mapper [prometheus.queue_duration.histogram.values] cannot be changed from type [float] to [long]
```
With this change, when multiple definitions generate the same dynamic
template for intermediate objects, only the last one ends up in the
template.

These intermediate objects were introduced in 8.12, after #169981.
kibanamachine pushed a commit to kibanamachine/kibana that referenced this pull request Jan 31, 2024
…jects (elastic#175970)

When there are multiple dynamic templates with the same name, we only
use the first appearance.
Add an exception for intermediate objects, so we use the last
appearance. This way we avoid that less specific dynamic templates
created for intermediate objects match before more specific dynamic
templates defined in packages.

This was a problem for example in the Prometheus package, where there
are definitions for `prometheus.*.value` and `prometheus.*.histogram`.
For both cases Fleet tries to create a dynamic template for the
intermediate objects `prometheus.*`. If this dynamic template is
inserted before the dynamic template for the histograms, it matches for
them, causing mapping errors on ingestion, like the following one:
```
mapper [prometheus.queue_duration.histogram.values] cannot be changed from type [float] to [long]
```
With this change, when multiple definitions generate the same dynamic
template for intermediate objects, only the last one ends up in the
template.

These intermediate objects were introduced in 8.12, after elastic#169981.

(cherry picked from commit 7274f6e)
kibanamachine referenced this pull request Jan 31, 2024
…iate objects (#175970) (#175991)

# Backport

This will backport the following commits from `main` to `8.12`:
- [[Fleet] Fix conflicting dynamic template mappings for intermediate
objects (#175970)](#175970)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Jaime Soriano
Pastor","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-01-31T14:51:39Z","message":"[Fleet]
Fix conflicting dynamic template mappings for intermediate objects
(#175970)\n\nWhen there are multiple dynamic templates with the same
name, we only\r\nuse the first appearance.\r\nAdd an exception for
intermediate objects, so we use the last\r\nappearance. This way we
avoid that less specific dynamic templates\r\ncreated for intermediate
objects match before more specific dynamic\r\ntemplates defined in
packages.\r\n\r\nThis was a problem for example in the Prometheus
package, where there\r\nare definitions for `prometheus.*.value` and
`prometheus.*.histogram`.\r\nFor both cases Fleet tries to create a
dynamic template for the\r\nintermediate objects `prometheus.*`. If this
dynamic template is\r\ninserted before the dynamic template for the
histograms, it matches for\r\nthem, causing mapping errors on ingestion,
like the following one:\r\n```\r\nmapper
[prometheus.queue_duration.histogram.values] cannot be changed from type
[float] to [long]\r\n```\r\nWith this change, when multiple definitions
generate the same dynamic\r\ntemplate for intermediate objects, only the
last one ends up in the\r\ntemplate.\r\n\r\nThese intermediate objects
were introduced in 8.12, after
https://github.com/elastic/kibana/pull/169981.","sha":"7274f6e2e152928418a677fcb6b9c3550b8a6227","branchLabelMapping":{"^v8.13.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","Team:Fleet","backport:prev-minor","v8.12.1","v8.13.0"],"title":"[Fleet]
Fix conflicting dynamic template mappings for intermediate
objects","number":175970,"url":"https://github.com/elastic/kibana/pull/175970","mergeCommit":{"message":"[Fleet]
Fix conflicting dynamic template mappings for intermediate objects
(#175970)\n\nWhen there are multiple dynamic templates with the same
name, we only\r\nuse the first appearance.\r\nAdd an exception for
intermediate objects, so we use the last\r\nappearance. This way we
avoid that less specific dynamic templates\r\ncreated for intermediate
objects match before more specific dynamic\r\ntemplates defined in
packages.\r\n\r\nThis was a problem for example in the Prometheus
package, where there\r\nare definitions for `prometheus.*.value` and
`prometheus.*.histogram`.\r\nFor both cases Fleet tries to create a
dynamic template for the\r\nintermediate objects `prometheus.*`. If this
dynamic template is\r\ninserted before the dynamic template for the
histograms, it matches for\r\nthem, causing mapping errors on ingestion,
like the following one:\r\n```\r\nmapper
[prometheus.queue_duration.histogram.values] cannot be changed from type
[float] to [long]\r\n```\r\nWith this change, when multiple definitions
generate the same dynamic\r\ntemplate for intermediate objects, only the
last one ends up in the\r\ntemplate.\r\n\r\nThese intermediate objects
were introduced in 8.12, after
https://github.com/elastic/kibana/pull/169981.","sha":"7274f6e2e152928418a677fcb6b9c3550b8a6227"}},"sourceBranch":"main","suggestedTargetBranches":["8.12"],"targetPullRequestStates":[{"branch":"8.12","label":"v8.12.1","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"main","label":"v8.13.0","branchLabelMappingKey":"^v8.13.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/175970","number":175970,"mergeCommit":{"message":"[Fleet]
Fix conflicting dynamic template mappings for intermediate objects
(#175970)\n\nWhen there are multiple dynamic templates with the same
name, we only\r\nuse the first appearance.\r\nAdd an exception for
intermediate objects, so we use the last\r\nappearance. This way we
avoid that less specific dynamic templates\r\ncreated for intermediate
objects match before more specific dynamic\r\ntemplates defined in
packages.\r\n\r\nThis was a problem for example in the Prometheus
package, where there\r\nare definitions for `prometheus.*.value` and
`prometheus.*.histogram`.\r\nFor both cases Fleet tries to create a
dynamic template for the\r\nintermediate objects `prometheus.*`. If this
dynamic template is\r\ninserted before the dynamic template for the
histograms, it matches for\r\nthem, causing mapping errors on ingestion,
like the following one:\r\n```\r\nmapper
[prometheus.queue_duration.histogram.values] cannot be changed from type
[float] to [long]\r\n```\r\nWith this change, when multiple definitions
generate the same dynamic\r\ntemplate for intermediate objects, only the
last one ends up in the\r\ntemplate.\r\n\r\nThese intermediate objects
were introduced in 8.12, after
https://github.com/elastic/kibana/pull/169981.","sha":"7274f6e2e152928418a677fcb6b9c3550b8a6227"}}]}]
BACKPORT-->

Co-authored-by: Jaime Soriano Pastor <[email protected]>
CoenWarmer pushed a commit to CoenWarmer/kibana that referenced this pull request Feb 15, 2024
…jects (elastic#175970)

When there are multiple dynamic templates with the same name, we only
use the first appearance.
Add an exception for intermediate objects, so we use the last
appearance. This way we avoid that less specific dynamic templates
created for intermediate objects match before more specific dynamic
templates defined in packages.

This was a problem for example in the Prometheus package, where there
are definitions for `prometheus.*.value` and `prometheus.*.histogram`.
For both cases Fleet tries to create a dynamic template for the
intermediate objects `prometheus.*`. If this dynamic template is
inserted before the dynamic template for the histograms, it matches for
them, causing mapping errors on ingestion, like the following one:
```
mapper [prometheus.queue_duration.histogram.values] cannot be changed from type [float] to [long]
```
With this change, when multiple definitions generate the same dynamic
template for intermediate objects, only the last one ends up in the
template.

These intermediate objects were introduced in 8.12, after elastic#169981.
fkanout pushed a commit to fkanout/kibana that referenced this pull request Mar 4, 2024
…jects (elastic#175970)

When there are multiple dynamic templates with the same name, we only
use the first appearance.
Add an exception for intermediate objects, so we use the last
appearance. This way we avoid that less specific dynamic templates
created for intermediate objects match before more specific dynamic
templates defined in packages.

This was a problem for example in the Prometheus package, where there
are definitions for `prometheus.*.value` and `prometheus.*.histogram`.
For both cases Fleet tries to create a dynamic template for the
intermediate objects `prometheus.*`. If this dynamic template is
inserted before the dynamic template for the histograms, it matches for
them, causing mapping errors on ingestion, like the following one:
```
mapper [prometheus.queue_duration.histogram.values] cannot be changed from type [float] to [long]
```
With this change, when multiple definitions generate the same dynamic
template for intermediate objects, only the last one ends up in the
template.

These intermediate objects were introduced in 8.12, after elastic#169981.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:skip This commit does not require backporting release_note:fix Team:Fleet Team label for Observability Data Collection Fleet team v8.12.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants