From 798cf8923aa57237723bc6e5d2f5e3175119d108 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 24 Feb 2023 15:47:57 +0100 Subject: [PATCH 1/4] updated server routes to use new versioned common types --- src/plugins/telemetry/common/routes.ts | 6 ------ src/plugins/telemetry/common/types.ts | 10 ---------- .../telemetry/server/routes/telemetry_config.ts | 5 +++-- .../server/routes/telemetry_last_reported.ts | 9 ++++++--- .../telemetry/server/routes/telemetry_opt_in.ts | 5 ++++- .../server/routes/telemetry_opt_in_stats.ts | 4 +++- .../server/routes/telemetry_usage_stats.ts | 7 +++++-- .../server/routes/telemetry_user_has_seen_notice.ts | 13 ++++++++++++- 8 files changed, 33 insertions(+), 26 deletions(-) delete mode 100644 src/plugins/telemetry/common/types.ts diff --git a/src/plugins/telemetry/common/routes.ts b/src/plugins/telemetry/common/routes.ts index 2161cb7dd5651..06d6f746bf2c1 100644 --- a/src/plugins/telemetry/common/routes.ts +++ b/src/plugins/telemetry/common/routes.ts @@ -10,9 +10,3 @@ * Fetch Telemetry Config */ export const FetchTelemetryConfigRoute = '/api/telemetry/v2/config'; -export interface FetchTelemetryConfigResponse { - allowChangingOptInStatus: boolean; - optIn: boolean | null; - sendUsageFrom: 'server' | 'browser'; - telemetryNotifyUserAboutOptInDefault: boolean; -} diff --git a/src/plugins/telemetry/common/types.ts b/src/plugins/telemetry/common/types.ts deleted file mode 100644 index aefbbd2358861..0000000000000 --- a/src/plugins/telemetry/common/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export type EncryptedTelemetryPayload = Array<{ clusterUuid: string; stats: string }>; -export type UnencryptedTelemetryPayload = Array<{ clusterUuid: string; stats: object }>; diff --git a/src/plugins/telemetry/server/routes/telemetry_config.ts b/src/plugins/telemetry/server/routes/telemetry_config.ts index 4bcf1d1f4c811..60a34d80aad2e 100644 --- a/src/plugins/telemetry/server/routes/telemetry_config.ts +++ b/src/plugins/telemetry/server/routes/telemetry_config.ts @@ -9,7 +9,8 @@ import { type Observable, firstValueFrom } from 'rxjs'; import type { IRouter, SavedObjectsClient } from '@kbn/core/server'; import type { TelemetryConfigType } from '../config'; -import { FetchTelemetryConfigResponse, FetchTelemetryConfigRoute } from '../../common/routes'; +import { v2 } from '../../common/types'; +import { FetchTelemetryConfigRoute } from '../../common/routes'; import { getTelemetrySavedObject } from '../saved_objects'; import { getNotifyUserAboutOptInDefault, @@ -64,7 +65,7 @@ export function registerTelemetryConfigRoutes({ telemetryOptedIn: optIn, }); - const body: FetchTelemetryConfigResponse = { + const body: v2.FetchTelemetryConfigResponse = { allowChangingOptInStatus, optIn, sendUsageFrom, diff --git a/src/plugins/telemetry/server/routes/telemetry_last_reported.ts b/src/plugins/telemetry/server/routes/telemetry_last_reported.ts index 80037761895b2..2e21785b9296d 100644 --- a/src/plugins/telemetry/server/routes/telemetry_last_reported.ts +++ b/src/plugins/telemetry/server/routes/telemetry_last_reported.ts @@ -9,6 +9,7 @@ import type { IRouter, SavedObjectsClient } from '@kbn/core/server'; import type { Observable } from 'rxjs'; import { firstValueFrom } from 'rxjs'; +import { v2 } from '../../common/types'; import { getTelemetrySavedObject, updateTelemetrySavedObject } from '../saved_objects'; export function registerTelemetryLastReported( @@ -25,10 +26,12 @@ export function registerTelemetryLastReported( const savedObjectsInternalClient = await firstValueFrom(savedObjectsInternalClient$); const telemetrySavedObject = await getTelemetrySavedObject(savedObjectsInternalClient); + const body: v2.FetchLastReportedResponse = { + lastReported: telemetrySavedObject && telemetrySavedObject?.lastReported, + }; + return res.ok({ - body: { - lastReported: telemetrySavedObject && telemetrySavedObject?.lastReported, - }, + body, }); } ); diff --git a/src/plugins/telemetry/server/routes/telemetry_opt_in.ts b/src/plugins/telemetry/server/routes/telemetry_opt_in.ts index e26e8c596b53a..cc477c4f23198 100644 --- a/src/plugins/telemetry/server/routes/telemetry_opt_in.ts +++ b/src/plugins/telemetry/server/routes/telemetry_opt_in.ts @@ -14,6 +14,7 @@ import type { StatsGetterConfig, TelemetryCollectionManagerPluginSetup, } from '@kbn/telemetry-collection-manager-plugin/server'; +import { v2 } from '../../common/types'; import { sendTelemetryOptInStatus } from './telemetry_opt_in_stats'; import { getTelemetrySavedObject, @@ -109,7 +110,9 @@ export function registerTelemetryOptInRoutes({ return res.forbidden(); } } - return res.ok({ body: optInStatus }); + + const body: v2.OptInResponse = optInStatus; + return res.ok({ body }); } ); } diff --git a/src/plugins/telemetry/server/routes/telemetry_opt_in_stats.ts b/src/plugins/telemetry/server/routes/telemetry_opt_in_stats.ts index d8ec9d4922fc1..8c9c85172ced6 100644 --- a/src/plugins/telemetry/server/routes/telemetry_opt_in_stats.ts +++ b/src/plugins/telemetry/server/routes/telemetry_opt_in_stats.ts @@ -14,6 +14,7 @@ import type { TelemetryCollectionManagerPluginSetup, StatsGetterConfig, } from '@kbn/telemetry-collection-manager-plugin/server'; +import type { v2 } from '../../common/types'; import { EncryptedTelemetryPayload, UnencryptedTelemetryPayload } from '../../common/types'; import { getTelemetryChannelEndpoint } from '../../common/telemetry_config'; import { PAYLOAD_CONTENT_ENCODING } from '../../common/constants'; @@ -90,7 +91,8 @@ export function registerTelemetryOptInStatsRoutes( newOptInStatus, statsGetterConfig ); - return res.ok({ body: optInStatus }); + const body: v2.OptInStatsResponse = optInStatus; + return res.ok({ body }); } catch (err) { return res.ok({ body: [] }); } diff --git a/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts b/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts index fd613e1318966..53169367b965e 100644 --- a/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts +++ b/src/plugins/telemetry/server/routes/telemetry_usage_stats.ts @@ -13,6 +13,7 @@ import type { StatsGetterConfig, } from '@kbn/telemetry-collection-manager-plugin/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; +import { v2 } from '../../common/types'; export type SecurityGetter = () => SecurityPluginStart | undefined; @@ -64,8 +65,10 @@ export function registerTelemetryUsageStatsRoutes( refreshCache: unencrypted || refreshCache, }; - const stats = await telemetryCollectionManager.getStats(statsConfig); - return res.ok({ body: stats }); + const body: v2.UnencryptedTelemetryPayload = await telemetryCollectionManager.getStats( + statsConfig + ); + return res.ok({ body }); } catch (err) { if (isDev) { // don't ignore errors when running in dev mode diff --git a/src/plugins/telemetry/server/routes/telemetry_user_has_seen_notice.ts b/src/plugins/telemetry/server/routes/telemetry_user_has_seen_notice.ts index 7686aa4100755..eeac24c0f5a07 100644 --- a/src/plugins/telemetry/server/routes/telemetry_user_has_seen_notice.ts +++ b/src/plugins/telemetry/server/routes/telemetry_user_has_seen_notice.ts @@ -8,6 +8,7 @@ import type { IRouter } from '@kbn/core/server'; import { TELEMETRY_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { v2 } from '../../common/types'; import { type TelemetrySavedObjectAttributes, getTelemetrySavedObject, @@ -33,7 +34,17 @@ export function registerTelemetryUserHasSeenNotice(router: IRouter) { }; await updateTelemetrySavedObject(soClient, updatedAttributes); - return res.ok({ body: updatedAttributes }); + const body: v2.Telemetry = { + allowChangingOptInStatus: updatedAttributes.allowChangingOptInStatus, + enabled: updatedAttributes.enabled, + lastReported: updatedAttributes.lastReported, + lastVersionChecked: updatedAttributes.lastVersionChecked, + reportFailureCount: updatedAttributes.reportFailureCount, + reportFailureVersion: updatedAttributes.reportFailureVersion, + sendUsageFrom: updatedAttributes.sendUsageFrom, + userHasSeenNotice: updatedAttributes.userHasSeenNotice, + }; + return res.ok({ body }); } ); } From 6d5c33ae5cc6bf1012e1b9ed43a56dc1ca0d994e Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 24 Feb 2023 15:48:09 +0100 Subject: [PATCH 2/4] added new common types --- src/plugins/telemetry/common/types/index.ts | 11 +++ src/plugins/telemetry/common/types/latest.ts | 9 +++ src/plugins/telemetry/common/types/v2.ts | 71 ++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/plugins/telemetry/common/types/index.ts create mode 100644 src/plugins/telemetry/common/types/latest.ts create mode 100644 src/plugins/telemetry/common/types/v2.ts diff --git a/src/plugins/telemetry/common/types/index.ts b/src/plugins/telemetry/common/types/index.ts new file mode 100644 index 0000000000000..14b2d3cbefcf4 --- /dev/null +++ b/src/plugins/telemetry/common/types/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './latest'; + +export * as v2 from './v2'; diff --git a/src/plugins/telemetry/common/types/latest.ts b/src/plugins/telemetry/common/types/latest.ts new file mode 100644 index 0000000000000..557f34eac9ee2 --- /dev/null +++ b/src/plugins/telemetry/common/types/latest.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './v2'; diff --git a/src/plugins/telemetry/common/types/v2.ts b/src/plugins/telemetry/common/types/v2.ts new file mode 100644 index 0000000000000..dc90ad3d242a6 --- /dev/null +++ b/src/plugins/telemetry/common/types/v2.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export interface Telemetry { + /** Whether telemetry is enabled */ + enabled?: boolean | null; + lastVersionChecked?: string; + /** Whether to send usage from the server or browser. */ + sendUsageFrom?: 'browser' | 'server'; + lastReported?: number; + allowChangingOptInStatus?: boolean; + userHasSeenNotice?: boolean; + reportFailureCount?: number; + reportFailureVersion?: string; +} + +export interface FetchTelemetryConfigResponse { + allowChangingOptInStatus: boolean; + optIn: boolean | null; + sendUsageFrom: 'server' | 'browser'; + telemetryNotifyUserAboutOptInDefault: boolean; +} + +export interface FetchLastReportedResponse { + lastReported: undefined | number; +} + +export type UpdateLastReportedResponse = undefined; + +export interface OptInStatsBody { + enabled: boolean; + /** @default true */ + unencrypted?: boolean; +} + +export interface StatsPayload { + cluster_uuid: string; + opt_in_status: boolean; +} + +export type OptInStatsResponse = Array<{ + clusterUuid: string; + stats: StatsPayload; +}>; + +export interface OptInBody { + enabled: boolean; +} + +export type OptInResponse = Array<{ + clusterUuid: string; + stats: string; +}>; + +export interface UsageStatsBody { + /** @default false */ + unencrypted: boolean; + /** @default false */ + refreshCache: boolean; +} + +export type UseHasSeenNoticeResponse = Telemetry; + +export type EncryptedTelemetryPayload = Array<{ clusterUuid: string; stats: string }>; + +export type UnencryptedTelemetryPayload = Array<{ clusterUuid: string; stats: object }>; From 4983cc3395f05e21a526072aa2bbf976ad660add Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 24 Feb 2023 15:58:59 +0100 Subject: [PATCH 3/4] update imports --- src/plugins/telemetry/public/services/telemetry_sender.ts | 2 +- src/plugins/telemetry/public/services/telemetry_service.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/telemetry/public/services/telemetry_sender.ts b/src/plugins/telemetry/public/services/telemetry_sender.ts index 6ffed583ec95c..3006a328fb620 100644 --- a/src/plugins/telemetry/public/services/telemetry_sender.ts +++ b/src/plugins/telemetry/public/services/telemetry_sender.ts @@ -12,7 +12,7 @@ import { exhaustMap } from 'rxjs/operators'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { LOCALSTORAGE_KEY, PAYLOAD_CONTENT_ENCODING } from '../../common/constants'; import { TelemetryService } from './telemetry_service'; -import type { EncryptedTelemetryPayload } from '../../common/types'; +import type { EncryptedTelemetryPayload } from '../../common/types/latest'; import { isReportIntervalExpired } from '../../common/is_report_interval_expired'; export class TelemetrySender { diff --git a/src/plugins/telemetry/public/services/telemetry_service.ts b/src/plugins/telemetry/public/services/telemetry_service.ts index 189df46b2328b..c1b96f4749067 100644 --- a/src/plugins/telemetry/public/services/telemetry_service.ts +++ b/src/plugins/telemetry/public/services/telemetry_service.ts @@ -10,7 +10,10 @@ import { i18n } from '@kbn/i18n'; import { CoreStart } from '@kbn/core/public'; import { TelemetryPluginConfig } from '../plugin'; import { getTelemetryChannelEndpoint } from '../../common/telemetry_config/get_telemetry_channel_endpoint'; -import type { UnencryptedTelemetryPayload, EncryptedTelemetryPayload } from '../../common/types'; +import type { + UnencryptedTelemetryPayload, + EncryptedTelemetryPayload, +} from '../../common/types/latest'; import { PAYLOAD_CONTENT_ENCODING } from '../../common/constants'; interface TelemetryServiceConstructor { From 71d6df3a851be5d3954c29cbd61226f9d02d6f5a Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 27 Feb 2023 10:14:49 +0100 Subject: [PATCH 4/4] fix TS issue --- src/plugins/telemetry/public/plugin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/telemetry/public/plugin.ts b/src/plugins/telemetry/public/plugin.ts index d28868a6dd286..15b581c498366 100644 --- a/src/plugins/telemetry/public/plugin.ts +++ b/src/plugins/telemetry/public/plugin.ts @@ -21,7 +21,8 @@ import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { ElasticV3BrowserShipper } from '@kbn/analytics-shippers-elastic-v3-browser'; import { of } from 'rxjs'; -import { FetchTelemetryConfigResponse, FetchTelemetryConfigRoute } from '../common/routes'; +import { FetchTelemetryConfigRoute } from '../common/routes'; +import type { v2 } from '../common/types'; import { TelemetrySender, TelemetryService, TelemetryNotifications } from './services'; import { renderWelcomeTelemetryNotice } from './render_welcome_telemetry_notice'; @@ -322,7 +323,7 @@ export class TelemetryPlugin implements Plugin { const { allowChangingOptInStatus, optIn, sendUsageFrom, telemetryNotifyUserAboutOptInDefault } = - await http.get(FetchTelemetryConfigRoute); + await http.get(FetchTelemetryConfigRoute); return { ...this.config,