diff --git a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts index 598328349227de..0dfc01df069ff7 100644 --- a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts +++ b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/add_monitor.ts @@ -7,6 +7,7 @@ import { schema } from '@kbn/config-schema'; import { SavedObject } from '@kbn/core/server'; import { + ConfigKey, MonitorFields, SyntheticsMonitor, EncryptedSyntheticsMonitor, @@ -57,7 +58,12 @@ export const addSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ sendTelemetryEvents( server.logger, server.telemetry, - formatTelemetryEvent({ monitor: newMonitor, errors, kibanaVersion: server.kibanaVersion }) + formatTelemetryEvent({ + monitor: newMonitor, + errors, + isInlineScript: Boolean((monitor as MonitorFields)[ConfigKey.SOURCE_INLINE]), + kibanaVersion: server.kibanaVersion, + }) ); if (errors && errors.length > 0) { diff --git a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts index dc6fc759e81a4b..980d26d2f39ad5 100644 --- a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts +++ b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/delete_monitor.ts @@ -7,6 +7,8 @@ import { schema } from '@kbn/config-schema'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import { + ConfigKey, + MonitorFields, EncryptedSyntheticsMonitor, SyntheticsMonitorWithSecrets, } from '../../../common/runtime_types'; @@ -66,7 +68,13 @@ export const deleteSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ sendTelemetryEvents( logger, telemetry, - formatTelemetryDeleteEvent(monitor, kibanaVersion, new Date().toISOString(), errors) + formatTelemetryDeleteEvent( + monitor, + kibanaVersion, + new Date().toISOString(), + Boolean((normalizedMonitor.attributes as MonitorFields)[ConfigKey.SOURCE_INLINE]), + errors + ) ); if (errors && errors.length > 0) { diff --git a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts index 55be289f7162a7..99f9d542dc8951 100644 --- a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts +++ b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/edit_monitor.ts @@ -79,24 +79,25 @@ export const editSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ return response.badRequest({ body: { message, attributes: { details, ...payload } } }); } - const monitorWithRevision = formatSecrets({ + const monitorWithRevision = { ...editedMonitor, revision: (previousMonitor.attributes[ConfigKey.REVISION] || 0) + 1, - }); + }; + const formattedMonitor = formatSecrets(monitorWithRevision); - const editMonitor: SavedObjectsUpdateResponse = + const updatedMonitor: SavedObjectsUpdateResponse = await savedObjectsClient.update( syntheticsMonitorType, monitorId, - monitor.type === 'browser' ? { ...monitorWithRevision, urls: '' } : monitorWithRevision + monitor.type === 'browser' ? { ...formattedMonitor, urls: '' } : formattedMonitor ); const errors = await syntheticsService.pushConfigs([ { ...editedMonitor, - id: editMonitor.id, + id: updatedMonitor.id, fields: { - config_id: editMonitor.id, + config_id: updatedMonitor.id, }, fields_under_root: true, }, @@ -105,7 +106,13 @@ export const editSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ sendTelemetryEvents( logger, telemetry, - formatTelemetryUpdateEvent(editMonitor, previousMonitor, kibanaVersion, errors) + formatTelemetryUpdateEvent( + updatedMonitor, + previousMonitor, + kibanaVersion, + Boolean((monitor as MonitorFields)[ConfigKey.SOURCE_INLINE]), + errors + ) ); // Return service sync errors in OK response @@ -115,7 +122,7 @@ export const editSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ }); } - return editMonitor; + return updatedMonitor; } catch (updateErr) { if (SavedObjectsErrorHelpers.isNotFoundError(updateErr)) { return getMonitorNotFoundResponse(response, monitorId); diff --git a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts index 9d8161b02b6340..95db598fa0e652 100644 --- a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts +++ b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.test.ts @@ -83,40 +83,10 @@ const createTestConfig = (extraConfigs: Record, updatedAt?: string) describe('monitor upgrade telemetry helpers', () => { it('formats telemetry events', () => { - const actual = formatTelemetryEvent({ monitor: testConfig, kibanaVersion, errors }); - expect(actual).toEqual({ - stackVersion: kibanaVersion, - configId: sha256.create().update(testConfig.id).hex(), - locations: ['us_central', 'other'], - locationsCount: 2, - monitorNameLength: testConfig.attributes[ConfigKey.NAME].length, - updatedAt: testConfig.updated_at, - type: testConfig.attributes[ConfigKey.MONITOR_TYPE], - scriptType: undefined, - monitorInterval: 180000, - lastUpdatedAt: undefined, - deletedAt: undefined, - errors, - durationSinceLastUpdated: undefined, - revision: 1, - }); - }); - - it.each([ - [ConfigKey.SOURCE_INLINE, 'recorder', true], - [ConfigKey.SOURCE_INLINE, 'inline', false], - [ConfigKey.SOURCE_ZIP_URL, 'zip', false], - ])('handles formatting scriptType for browser monitors', (config, scriptType, isRecorder) => { const actual = formatTelemetryEvent({ - monitor: createTestConfig({ - [config]: 'test', - [ConfigKey.METADATA]: { - script_source: { - is_generated_script: isRecorder, - }, - }, - }), + monitor: testConfig, kibanaVersion, + isInlineScript: false, errors, }); expect(actual).toEqual({ @@ -127,7 +97,7 @@ describe('monitor upgrade telemetry helpers', () => { monitorNameLength: testConfig.attributes[ConfigKey.NAME].length, updatedAt: testConfig.updated_at, type: testConfig.attributes[ConfigKey.MONITOR_TYPE], - scriptType, + scriptType: undefined, monitorInterval: 180000, lastUpdatedAt: undefined, deletedAt: undefined, @@ -137,11 +107,51 @@ describe('monitor upgrade telemetry helpers', () => { }); }); + it.each([ + [ConfigKey.SOURCE_INLINE, 'recorder', true, true], + [ConfigKey.SOURCE_INLINE, 'inline', false, true], + [ConfigKey.SOURCE_ZIP_URL, 'zip', false, false], + ])( + 'handles formatting scriptType for browser monitors', + (config, scriptType, isRecorder, isInlineScript) => { + const actual = formatTelemetryEvent({ + monitor: createTestConfig({ + [config]: 'test', + [ConfigKey.METADATA]: { + script_source: { + is_generated_script: isRecorder, + }, + }, + }), + isInlineScript, + kibanaVersion, + errors, + }); + expect(actual).toEqual({ + stackVersion: kibanaVersion, + configId: sha256.create().update(testConfig.id).hex(), + locations: ['us_central', 'other'], + locationsCount: 2, + monitorNameLength: testConfig.attributes[ConfigKey.NAME].length, + updatedAt: testConfig.updated_at, + type: testConfig.attributes[ConfigKey.MONITOR_TYPE], + scriptType, + monitorInterval: 180000, + lastUpdatedAt: undefined, + deletedAt: undefined, + errors, + durationSinceLastUpdated: undefined, + revision: 1, + }); + } + ); + it('handles formatting update events', () => { const actual = formatTelemetryUpdateEvent( createTestConfig({}, '2011-10-05T16:48:00.000Z'), testConfig, kibanaVersion, + false, errors ); expect(actual).toEqual({ @@ -167,6 +177,7 @@ describe('monitor upgrade telemetry helpers', () => { testConfig, kibanaVersion, '2011-10-05T16:48:00.000Z', + false, errors ); expect(actual).toEqual({ @@ -198,12 +209,13 @@ describe('sendTelemetryEvents', () => { }); it('should queue telemetry events with generic error', () => { - const event = formatTelemetryEvent({ monitor: testConfig, kibanaVersion, errors }); - sendTelemetryEvents( - loggerMock, - eventsTelemetryMock, - formatTelemetryEvent({ monitor: testConfig, kibanaVersion, errors }) - ); + const event = formatTelemetryEvent({ + monitor: testConfig, + kibanaVersion, + isInlineScript: true, + errors, + }); + sendTelemetryEvents(loggerMock, eventsTelemetryMock, event); expect(eventsTelemetryMock.queueTelemetryEvents).toHaveBeenCalledWith(MONITOR_UPDATE_CHANNEL, [ event, diff --git a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts index 526e40ef2f230b..55c97fd3c10061 100644 --- a/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts +++ b/x-pack/plugins/synthetics/server/rest_api/synthetics_service/telemetry/monitor_upgrade_sender.ts @@ -44,6 +44,7 @@ export function sendTelemetryEvents( export function formatTelemetryEvent({ monitor, kibanaVersion, + isInlineScript, lastUpdatedAt, durationSinceLastUpdated, deletedAt, @@ -51,6 +52,7 @@ export function formatTelemetryEvent({ }: { monitor: SavedObject; kibanaVersion: string; + isInlineScript: boolean; lastUpdatedAt?: string; durationSinceLastUpdated?: number; deletedAt?: string; @@ -71,7 +73,7 @@ export function formatTelemetryEvent({ monitorNameLength: attributes[ConfigKey.NAME].length, monitorInterval: scheduleToMilli(attributes[ConfigKey.SCHEDULE]), stackVersion: kibanaVersion, - scriptType: getScriptType(attributes as Partial), + scriptType: getScriptType(attributes as Partial, isInlineScript), errors: errors && errors?.length ? errors.map((e) => ({ @@ -92,6 +94,7 @@ export function formatTelemetryUpdateEvent( currentMonitor: SavedObjectsUpdateResponse, previousMonitor: SavedObject, kibanaVersion: string, + isInlineScript: boolean, errors?: ServiceLocationErrors | null ) { let durationSinceLastUpdated: number = 0; @@ -106,6 +109,7 @@ export function formatTelemetryUpdateEvent( kibanaVersion, durationSinceLastUpdated, lastUpdatedAt: previousMonitor.updated_at, + isInlineScript, errors, }); } @@ -114,6 +118,7 @@ export function formatTelemetryDeleteEvent( previousMonitor: SavedObject, kibanaVersion: string, deletedAt: string, + isInlineScript: boolean, errors?: ServiceLocationErrors | null ) { let durationSinceLastUpdated: number = 0; @@ -128,21 +133,20 @@ export function formatTelemetryDeleteEvent( durationSinceLastUpdated, lastUpdatedAt: previousMonitor.updated_at, deletedAt, + isInlineScript, errors, }); } function getScriptType( - attributes: Partial + attributes: Partial, + isInlineScript: boolean ): 'inline' | 'recorder' | 'zip' | undefined { if (attributes[ConfigKey.SOURCE_ZIP_URL]) { return 'zip'; - } else if ( - attributes[ConfigKey.SOURCE_INLINE] && - attributes[ConfigKey.METADATA]?.script_source?.is_generated_script - ) { + } else if (isInlineScript && attributes[ConfigKey.METADATA]?.script_source?.is_generated_script) { return 'recorder'; - } else if (attributes[ConfigKey.SOURCE_INLINE]) { + } else if (isInlineScript) { return 'inline'; }