diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index 7949c9ab98a71..3e9363fa9828f 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -534,9 +534,15 @@ export function generateTemplateName(dataStream: RegistryDataStream): string { /** * Given a data stream name, return the indexTemplate name */ -function dataStreamNameToIndexTemplateName(dataStreamName: string): string { - const [type, dataset] = dataStreamName.split('-'); // ignore namespace at the end - return [type, dataset].join('-'); +async function getIndexTemplate( + esClient: ElasticsearchClient, + dataStreamName: string +): Promise { + const dataStream = await esClient.indices.getDataStream({ + name: dataStreamName, + expand_wildcards: ['open', 'hidden'], + }); + return dataStream.data_streams[0].template; } export function generateTemplateIndexPattern(dataStream: RegistryDataStream): string { @@ -757,9 +763,9 @@ const updateExistingDataStream = async ({ let lifecycle: any; try { - const simulateResult = await retryTransientEsErrors(() => + const simulateResult = await retryTransientEsErrors(async () => esClient.indices.simulateTemplate({ - name: dataStreamNameToIndexTemplateName(dataStreamName), + name: await getIndexTemplate(esClient, dataStreamName), }) ); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts b/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts index c734af44b36f4..93b30775170dc 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts @@ -23,7 +23,7 @@ export default function (providerContext: FtrProviderContext) { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); - after(async () => { + afterEach(async () => { await deletePackage('apm', '8.8.0'); }); @@ -88,5 +88,60 @@ export default function (providerContext: FtrProviderContext) { // datastream rolled over expect(Object.keys(ds).length).greaterThan(1); }); + + it('should not rollover datastreams when successfully updated mappings', async function () { + await supertest + .post(`/api/fleet/epm/packages/apm/8.8.0`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + + await es.index({ + index: 'metrics-apm.app.default-default', + document: { + '@timestamp': '2023-05-30T07:50:00.000Z', + agent: { + name: 'go', + }, + data_stream: { + dataset: 'metrics-apm.app.default', + namespace: 'default', + type: 'metrics', + }, + ecs: { + version: '8.8.0-dev', + }, + event: { + agent_id_status: 'missing', + ingested: '2023-05-30T07:57:12Z', + }, + observer: { + hostname: '047e282994fb', + type: 'apm-server', + version: '8.8.0', + }, + }, + }); + + let ds = await es.indices.get({ + index: 'metrics-apm.app.default*', + expand_wildcards: ['open', 'hidden'], + }); + const indicesBefore = Object.keys(ds).length; + + await supertest + .post(`/api/fleet/epm/packages/apm/8.8.0`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + + ds = await es.indices.get({ + index: 'metrics-apm.app.default*', + expand_wildcards: ['open', 'hidden'], + }); + const indicesAfter = Object.keys(ds).length; + // datastream did not roll over + expect(indicesAfter).equal(indicesBefore); + }); }); }