Skip to content

Commit

Permalink
implement all telemetry events
Browse files Browse the repository at this point in the history
  • Loading branch information
semd committed Feb 6, 2025
1 parent db4f79c commit 59aae05
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 106 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const eventSchemas: SiemMigrationsTelemetryEventSchemas = {
},
},
},
[SiemMigrationsEventTypes.SetupMigrationOpenUpload]: {
[SiemMigrationsEventTypes.SetupMigrationOpenResources]: {
...migrationIdSchema,
missingResourcesCount: {
type: 'integer',
Expand All @@ -81,63 +81,52 @@ const eventSchemas: SiemMigrationsTelemetryEventSchemas = {
},
},
},
[SiemMigrationsEventTypes.SetupRulesQueryCopied]: {
connectorId: {
type: 'keyword',
_meta: {
description: 'Connector ID',
optional: false,
},
},
},
[SiemMigrationsEventTypes.SetupRulesUploaded]: {
[SiemMigrationsEventTypes.SetupMigrationCreated]: {
...baseResultActionSchema,
connectorId: {
type: 'keyword',
migrationId: {
...migrationIdSchema.migrationId,
_meta: {
description: 'Connector ID',
optional: false,
...migrationIdSchema.migrationId._meta,
optional: true, // Error case does not have the migration ID
},
},
count: {
rulesCount: {
type: 'integer',
_meta: {
description: 'Number of rules uploaded',
optional: false,
},
},
},
[SiemMigrationsEventTypes.SetupRulesQueryCopied]: {
migrationId: {
...migrationIdSchema.migrationId,
_meta: {
...migrationIdSchema.migrationId._meta,
optional: true, // Migration is not usually created yet when the query is copied
},
},
},
[SiemMigrationsEventTypes.SetupMacrosQueryCopied]: {
...migrationIdSchema,
},
[SiemMigrationsEventTypes.SetupMacrosUploaded]: {
...baseResultActionSchema,
[SiemMigrationsEventTypes.SetupLookupNameCopied]: {
...migrationIdSchema,
count: {
type: 'integer',
_meta: {
description: 'Number of macros uploaded',
optional: false,
},
},
},
[SiemMigrationsEventTypes.SetupLookupsQueryCopied]: {
[SiemMigrationsEventTypes.SetupResourcesUploaded]: {
...baseResultActionSchema,
...migrationIdSchema,
lookupName: {
type: {
type: 'keyword',
_meta: {
description: 'The name of the lookup copied',
description: `Resource type, can be one of 'macro' or 'lookup'`,
optional: false,
},
},
},
[SiemMigrationsEventTypes.SetupLookupsUploaded]: {
...baseResultActionSchema,
...migrationIdSchema,
count: {
type: 'integer',
_meta: {
description: 'Number of lookups uploaded',
description: 'Number of resources uploaded',
optional: false,
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@
*/

import type { RootSchema } from '@kbn/core/public';
import type { RuleMigrationResourceType } from '../../../../../../common/siem_migrations/model/rule_migration.gen';
import type { SiemMigrationRetryFilter } from '../../../../../../common/siem_migrations/constants';

export enum SiemMigrationsEventTypes {
SetupConnectorSelected = '[SIEM_Migrations] Setup connector selected',
SetupMigrationOpenNew = '[SIEM_Migrations] Setup rule migration opened',
SetupMigrationOpenUpload = '[SIEM_Migrations] Setup rule migration opened upload',
SetupRulesQueryCopied = '[SIEM_Migrations] Setup rules query copied',
SetupRulesUploaded = '[SIEM_Migrations] Setup rules uploaded',
SetupMacrosQueryCopied = '[SIEM_Migrations] Setup macros query copied',
SetupMacrosUploaded = '[SIEM_Migrations] Setup macros uploaded',
SetupLookupsQueryCopied = '[SIEM_Migrations] Setup lookups query copied',
SetupLookupsUploaded = '[SIEM_Migrations] Setup lookups uploaded',
StartTranslation = '[SIEM_Migrations] Start translation',
TranslatedRuleUpdate = '[SIEM_Migrations] Translated rule update',
TranslatedRuleInstall = '[SIEM_Migrations] Translated rule install',
TranslatedRuleBulkInstall = '[SIEM_Migrations] Translated rule bulk install',
SetupConnectorSelected = 'siem_migrations_setup_connector_selected',
SetupMigrationOpenNew = 'siem_migrations_setup_rules_migration_open_new',
SetupMigrationCreated = 'siem_migrations_setup_rules_migration_created',
SetupResourcesUploaded = 'siem_migrations_setup_rules_resources_uploaded',
SetupMigrationOpenResources = 'siem_migrations_setup_rules_migration_open_resources',
SetupRulesQueryCopied = 'siem_migrations_setup_rules_query_copied',
SetupMacrosQueryCopied = 'siem_migrations_setup_rules_macros_query_copied',
SetupLookupNameCopied = 'siem_migrations_setup_rules_lookup_name_copied',
StartTranslation = 'siem_migrations_start_rules_translation',
TranslatedRuleUpdate = 'siem_migrations_translated_rule_update',
TranslatedRuleInstall = 'siem_migrations_translated_rule_install',
TranslatedRuleBulkInstall = 'siem_migrations_translated_rule_bulk_install',
}

export interface BaseResultActionParams {
Expand All @@ -42,30 +42,26 @@ interface ReportSetupConnectorSelectedActionParams {
interface ReportSetupMigrationOpenNewActionParams {
isFirstMigration: boolean;
}
interface ReportSetupMigrationOpenUploadActionParams {
interface ReportSetupMigrationOpenResourcesActionParams {
migrationId: string;
missingResourcesCount: number;
}
interface ReportSetupRulesQueryCopiedActionParams {
connectorId: string;
migrationId?: string;
}
interface ReportSetupRulesUploadedActionParams extends BaseResultActionParams {
connectorId: string;
count: number;
interface ReportSetupMigrationCreatedActionParams extends BaseResultActionParams {
migrationId?: string;
rulesCount: number;
}
interface ReportSetupMacrosQueryCopiedActionParams {
migrationId: string;
}
interface ReportSetupMacrosUploadedActionParams extends BaseResultActionParams {
migrationId: string;
count: number;
}
interface ReportSetupLookupsQueryCopiedActionParams {
interface ReportSetupLookupNameCopiedActionParams {
migrationId: string;
lookupName: string;
}
interface ReportSetupLookupsUploadedActionParams extends BaseResultActionParams {
interface ReportSetupResourcesUploadedActionParams extends BaseResultActionParams {
migrationId: string;
type: RuleMigrationResourceType;
count: number;
}

Expand Down Expand Up @@ -103,13 +99,12 @@ interface ReportTranslatedRuleBulkInstallActionParams {
export interface SiemMigrationsTelemetryEventsMap {
[SiemMigrationsEventTypes.SetupConnectorSelected]: ReportSetupConnectorSelectedActionParams;
[SiemMigrationsEventTypes.SetupMigrationOpenNew]: ReportSetupMigrationOpenNewActionParams;
[SiemMigrationsEventTypes.SetupMigrationOpenUpload]: ReportSetupMigrationOpenUploadActionParams;
[SiemMigrationsEventTypes.SetupMigrationOpenResources]: ReportSetupMigrationOpenResourcesActionParams;
[SiemMigrationsEventTypes.SetupRulesQueryCopied]: ReportSetupRulesQueryCopiedActionParams;
[SiemMigrationsEventTypes.SetupRulesUploaded]: ReportSetupRulesUploadedActionParams;
[SiemMigrationsEventTypes.SetupMigrationCreated]: ReportSetupMigrationCreatedActionParams;
[SiemMigrationsEventTypes.SetupMacrosQueryCopied]: ReportSetupMacrosQueryCopiedActionParams;
[SiemMigrationsEventTypes.SetupMacrosUploaded]: ReportSetupMacrosUploadedActionParams;
[SiemMigrationsEventTypes.SetupLookupsQueryCopied]: ReportSetupLookupsQueryCopiedActionParams;
[SiemMigrationsEventTypes.SetupLookupsUploaded]: ReportSetupLookupsUploadedActionParams;
[SiemMigrationsEventTypes.SetupLookupNameCopied]: ReportSetupLookupNameCopiedActionParams;
[SiemMigrationsEventTypes.SetupResourcesUploaded]: ReportSetupResourcesUploadedActionParams;
[SiemMigrationsEventTypes.StartTranslation]: ReportStartTranslationActionParams;
[SiemMigrationsEventTypes.TranslatedRuleUpdate]: ReportTranslatedRuleUpdateActionParams;
[SiemMigrationsEventTypes.TranslatedRuleInstall]: ReportTranslatedRuleInstallActionParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
EuiTitle,
} from '@elastic/eui';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useKibana } from '../../../../../../common/lib/kibana/kibana_react';
import type {
RuleMigrationResourceData,
RuleMigrationTaskStats,
Expand Down Expand Up @@ -94,6 +95,7 @@ const END = 10 as const;
type SubStep = 1 | 2 | typeof END;
export const LookupsDataInputSubSteps = React.memo<LookupsDataInputSubStepsProps>(
({ migrationStats, missingLookups, onAllLookupsCreated }) => {
const { telemetry } = useKibana().services.siemMigrations.rules;
const [subStep, setSubStep] = useState<SubStep>(1);
const [uploadedLookups, setUploadedLookups] = useState<UploadedLookups>({});

Expand All @@ -114,7 +116,9 @@ export const LookupsDataInputSubSteps = React.memo<LookupsDataInputSubStepsProps
// Copy query step
const onCopied = useCallback(() => {
setSubStep(2);
}, []);
telemetry.reportSetupLookupNameCopied({ migrationId: migrationStats.id });
}, [telemetry, migrationStats.id]);

const copyStep = useMissingLookupsListStep({
status: getStatus(1, subStep),
migrationStats,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import type { EuiStepProps } from '@elastic/eui';
import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiStepNumber, EuiTitle } from '@elastic/eui';
import React, { useCallback, useMemo, useState } from 'react';
import { useKibana } from '../../../../../../common/lib/kibana/kibana_react';
import type { RuleMigrationTaskStats } from '../../../../../../../common/siem_migrations/model/rule_migration.gen';
import type { OnResourcesCreated, OnMissingResourcesFetched } from '../../types';
import { getStatus } from '../common/get_status';
Expand Down Expand Up @@ -75,12 +76,14 @@ const END = 10 as const;
type SubStep = 1 | 2 | 3 | typeof END;
export const MacrosDataInputSubSteps = React.memo<MacrosDataInputSubStepsProps>(
({ migrationStats, missingMacros, onMissingResourcesFetched }) => {
const { telemetry } = useKibana().services.siemMigrations.rules;
const [subStep, setSubStep] = useState<SubStep>(missingMacros.length ? 1 : 3);

// Copy query step
const onCopied = useCallback(() => {
setSubStep(2);
}, []);
telemetry.reportSetupMacrosQueryCopied({ migrationId: migrationStats.id });
}, [telemetry, migrationStats.id]);
const copyStep = useCopyExportQueryStep({ status: getStatus(1, subStep), onCopied });

// Upload macros step
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import type { EuiStepProps } from '@elastic/eui';
import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiStepNumber, EuiTitle } from '@elastic/eui';
import React, { useCallback, useMemo, useState } from 'react';
import { useKibana } from '../../../../../../common/lib/kibana';
import type { RuleMigrationTaskStats } from '../../../../../../../common/siem_migrations/model/rule_migration.gen';
import type { OnMigrationCreated, OnMissingResourcesFetched } from '../../types';
import * as i18n from './translations';
Expand Down Expand Up @@ -72,12 +73,15 @@ const END = 10 as const;
type SubStep = 1 | 2 | 3 | typeof END;
export const RulesDataInputSubSteps = React.memo<RulesDataInputSubStepsProps>(
({ migrationStats, onMigrationCreated, onMissingResourcesFetched }) => {
const { telemetry } = useKibana().services.siemMigrations.rules;
const [subStep, setSubStep] = useState<SubStep>(migrationStats ? 3 : 1);

// Copy query step
const onCopied = useCallback(() => {
setSubStep(2);
}, []);
telemetry.reportSetupRulesQueryCopied({ migrationId: migrationStats?.id });
}, [telemetry, migrationStats?.id]);

const copyStep = useCopyExportQueryStep({ status: getStatus(1, subStep), onCopied });

// Upload rules step
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,30 +102,47 @@ export class SiemRulesMigrationsService {
}

public async createRuleMigration(body: CreateRuleMigrationRequestBody): Promise<string> {
if (body.length === 0) {
const rulesCount = body.length;
if (rulesCount === 0) {
throw new Error(i18n.EMPTY_RULES_ERROR);
}
// Batching creation to avoid hitting the max payload size limit of the API
let migrationId: string | undefined;
for (let i = 0; i < body.length; i += CREATE_MIGRATION_BODY_BATCH_SIZE) {
const bodyBatch = body.slice(i, i + CREATE_MIGRATION_BODY_BATCH_SIZE);
const response = await createRuleMigration({ migrationId, body: bodyBatch });
migrationId = response.migration_id;

try {
let migrationId: string | undefined;
// Batching creation to avoid hitting the max payload size limit of the API
for (let i = 0; i < rulesCount; i += CREATE_MIGRATION_BODY_BATCH_SIZE) {
const bodyBatch = body.slice(i, i + CREATE_MIGRATION_BODY_BATCH_SIZE);
const response = await createRuleMigration({ migrationId, body: bodyBatch });
migrationId = response.migration_id;
}
this.telemetry.reportSetupMigrationCreated({ migrationId, rulesCount });
return migrationId as string;
} catch (error) {
this.telemetry.reportSetupMigrationCreated({ rulesCount, error });
throw error;
}
return migrationId as string;
}

public async upsertMigrationResources(
migrationId: string,
body: UpsertRuleMigrationResourcesRequestBody
): Promise<void> {
if (body.length === 0) {
const count = body.length;
if (count === 0) {
throw new Error(i18n.EMPTY_RULES_ERROR);
}
// Batching creation to avoid hitting the max payload size limit of the API
for (let i = 0; i < body.length; i += CREATE_MIGRATION_BODY_BATCH_SIZE) {
const bodyBatch = body.slice(i, i + CREATE_MIGRATION_BODY_BATCH_SIZE);
await upsertMigrationResources({ migrationId, body: bodyBatch });
// We assume all resources are of the same type. There is no use case for mixing types in a single upload
const type = body[0].type;
try {
// Batching creation to avoid hitting the max payload size limit of the API
for (let i = 0; i < count; i += CREATE_MIGRATION_BODY_BATCH_SIZE) {
const bodyBatch = body.slice(i, i + CREATE_MIGRATION_BODY_BATCH_SIZE);
await upsertMigrationResources({ migrationId, body: bodyBatch });
}
this.telemetry.reportSetupResourceUploaded({ migrationId, type, count });
} catch (error) {
this.telemetry.reportSetupResourceUploaded({ migrationId, type, count, error });
throw error;
}
}

Expand Down
Loading

0 comments on commit 59aae05

Please sign in to comment.