-
Notifications
You must be signed in to change notification settings - Fork 8.2k
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
[Feature Flags Service] Hello world 👋 #188562
Conversation
4c7696e
to
3798c54
Compare
837a344
to
b869c25
Compare
ba869fa
to
54e69e6
Compare
/ci |
3 similar comments
/ci |
/ci |
/ci |
0dcb43e
to
b4ebef0
Compare
/ci |
6 similar comments
/ci |
/ci |
/ci |
/ci |
/ci |
/ci |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code LGTM from the security perspective 👍
} | ||
|
||
export interface UserMetadata extends Record<string, string | boolean | number | undefined> { | ||
export interface FlatMetadata { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
observation: it looks like some of the properties use camelCase
, and some snake_case
. Not sure if it's something we can change and make consistent at this point though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oh! fair point! FWIW, the 2 camelCased
keys are destructed and renamed to key
inside the sub-context object. They were intentionally different for that purpose. But happy to change it if you think it's confusing :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's slightly confusing, but I can live with that 🙂
public start(core: CoreStart) { | ||
// Promise form: when we need to fetch it once, like in an HTTP request | ||
void Promise.all([ | ||
core.featureFlags.getBooleanValue('example-boolean', false), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: what does happen if I have a typo in the flag name here? Just wondering how easy it'd be to catch bugs like this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a great point! It will always return the fallback value.
I should probably document as a good practice to define the flag key as a constant in common
(if used on both ends) and import the constant when needed.
Addressed in 43f366d
(#188562)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! I'm also wondering if there's any valid use case where code tries to fetch a flag that isn't registered for some reason?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Technically, the flags don't need to be registered to run.
That's why I am trying to decouple the gitops flow (the one requiring flags to be programmatically registered) and the actual runtime. I'm hoping this would avoid unnecessarily having extra objects in memory during runtime (to keep the registry).
any valid use case where code tries to fetch a flag that isn't registered
I can only think about 2 edge scenarios:
- Registered by another plugin: similar to UI Settings, another plugin of the same solution might register the flag, and it can be reused in other related plugins/packages.
- We need to create a flag manually (outside of our gitops process) for whatever reason (that type of flag is not supported and we really-really-really need it).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense to me, thanks for clarifying!
constructor(private readonly core: CoreContext) { | ||
this.logger = core.logger.get('feature-flags-service'); | ||
this.featureFlagsClient = OpenFeature.getClient(); | ||
OpenFeature.setLogger(this.logger.get('open-feature')); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: what kind of information OpenFeature
might log? You know what I'm alluding to 🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried running all services in debug level, and log entries look safe to me:
With an invalid SDK key (server side)
[DEBUG][plugins.featureFlagsExample] "/Users/afharo/Developer/elastic/kibana/examples/feature_flags_example/server" does not export "config". {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments] Initializing plugin {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments.launch-darkly] Started EventProcessor. {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.featureFlagsExample] Initializing plugin {"service":{"node":{"roles":["background_tasks","ui"]}}} [INFO ][plugins.featureFlagsExample] The observed feature flags are: - example-boolean: false - example-string: red - example-number: 1 {"service":{"node":{"roles":["background_tasks","ui"]}}} [INFO ][plugins.featureFlagsExample] The feature flags are: - example-boolean: false - example-string: white - example-number: 1 {"service":{"node":{"roles":["background_tasks","ui"]}}} [ERROR][plugins.cloudExperiments.launch-darkly] Authentication failed. Double check your SDK key. {"service":{"node":{"roles":["background_tasks","ui"]}}} [ERROR][plugins.cloudExperiments.launch-darkly] Received error 401 (invalid SDK key) for streaming request - giving up permanently {"service":{"node":{"roles":["background_tasks","ui"]}}} [ERROR][feature-flags-service.open-feature] Error during provider initialization: {"service":{"node":{"roles":["background_tasks","ui"]}}}
With an invalid Client ID (browser side)
feature_flags_service.ts:56 warn: [LaunchDarkly] The waitForInitialization function was called without a timeout specified. In a future version a default timeout will be applied. ldclient.cjs.js:1 debug: [LaunchDarkly] sending diagnostic event (diagnostic-combined) ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "identify" event ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 feature_flags_service.ts:56 GET https://app.launchdarkly.com/sdk/goals/668ea35e5dd98d109e1bc7d 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 l @ ldclient.cjs.js:1 Qe.c.fetchJSON @ ldclient.cjs.js:1 At @ ldclient.cjs.js:1 Nt @ ldclient.cjs.js:1 (anonymous) @ index.cjs.js:278 (anonymous) @ index.cjs.js:46 __awaiter @ index.cjs.js:42 initialize @ index.cjs.js:275 setAwaitableProvider @ index.js:595 (anonymous) @ index.js:681 (anonymous) @ index.js:69 __async @ index.js:53 setProviderAndWait @ index.js:670 setProvider @ feature_flags_service.ts:56 setup @ plugin.ts:50 setup @ plugin.ts:48 setup @ plugins_service.ts:71 setup @ core_system.ts:262 await in setup __kbnBootstrap__ @ kbn_bootstrap.ts:34 await in __kbnBootstrap__ (anonymous) @ bootstrap.js:136 innerCb @ bootstrap.js:115 load loadScript @ bootstrap.js:105 (anonymous) @ bootstrap.js:124 load @ bootstrap.js:111 window.onload @ bootstrap.js:133 load (anonymous) @ bootstrap.js:47 Show 18 more frames Show less ldclient.cjs.js:1 error: [LaunchDarkly] Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIn0sIm9yZ2FuaXphdGlvbiI6eyJrZXkiOiIxMjM0NSIsImlzX2VsYXN0aWNfc3RhZmYiOnRydWV9fQ feature_flags_service.ts:56 POST https://events.launchdarkly.com/events/diagnostic/668ea35e5dd98d109e1bc7d 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 t @ ldclient.cjs.js:1 o.sendEvents @ ldclient.cjs.js:1 h @ ldclient.cjs.js:1 y @ ldclient.cjs.js:1 (anonymous) @ ldclient.cjs.js:1 (anonymous) @ ldclient.cjs.js:1 Promise.then (anonymous) @ ldclient.cjs.js:1 DiagnosticsManager.p.start @ ldclient.cjs.js:1 start @ ldclient.cjs.js:1 Nt @ ldclient.cjs.js:1 (anonymous) @ index.cjs.js:278 (anonymous) @ index.cjs.js:46 __awaiter @ index.cjs.js:42 initialize @ index.cjs.js:275 setAwaitableProvider @ index.js:595 (anonymous) @ index.js:681 (anonymous) @ index.js:69 __async @ index.js:53 setProviderAndWait @ index.js:670 setProvider @ feature_flags_service.ts:56 setup @ plugin.ts:50 setup @ plugin.ts:48 setup @ plugins_service.ts:71 setup @ core_system.ts:262 await in setup __kbnBootstrap__ @ kbn_bootstrap.ts:34 await in __kbnBootstrap__ (anonymous) @ bootstrap.js:136 innerCb @ bootstrap.js:115 load loadScript @ bootstrap.js:105 (anonymous) @ bootstrap.js:124 load @ bootstrap.js:111 window.onload @ bootstrap.js:133 load (anonymous) @ bootstrap.js:47 Show 24 more frames Show less feature_flags_service.ts:155 GET https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIn0sIm9yZ2FuaXphdGlvbiI6eyJrZXkiOiIxMjM0NSIsImlzX2VsYXN0aWNfc3RhZmYiOnRydWV9fQ 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 l @ ldclient.cjs.js:1 Qe.c.fetchFlagSettings @ ldclient.cjs.js:1 (anonymous) @ ldclient.cjs.js:1 Promise.then identify @ ldclient.cjs.js:1 (anonymous) @ index.cjs.js:311 (anonymous) @ index.cjs.js:46 __awaiter @ index.cjs.js:42 onContextChange @ index.cjs.js:309 (anonymous) @ index.js:811 (anonymous) @ index.js:69 __async @ index.js:53 runProviderContextChangeHandler @ index.js:806 (anonymous) @ index.js:728 (anonymous) @ index.js:728 (anonymous) @ index.js:69 __async @ index.js:53 setContext @ index.js:702 appendContext @ feature_flags_service.ts:155 appendContext @ feature_flags_service.ts:58 (anonymous) @ initialize_metadata.ts:40 doInnerSub @ mergeInternals.js:19 outerNext @ mergeInternals.js:14 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ Subject.js:41 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subject.js.Subject.next @ Subject.js:31 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/ReplaySubject.js.ReplaySubject.next @ ReplaySubject.js:28 next @ share.js:46 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.ConsumerObserver.next @ Subscriber.js:96 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber._next @ Subscriber.js:63 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ map.js:7 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ distinct.js:12 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 emit @ debounceTime.js:16 emitWhenIdle @ debounceTime.js:27 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction._execute @ AsyncAction.js:62 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.execute @ AsyncAction.js:50 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js.AsyncScheduler.flush @ AsyncScheduler.js:21 setInterval setInterval @ intervalProvider.js:12 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.requestAsyncId @ AsyncAction.js:33 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.schedule @ AsyncAction.js:28 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Scheduler.js.Scheduler.schedule @ Scheduler.js:10 (anonymous) @ debounceTime.js:33 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ filter.js:6 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js.BehaviorSubject._subscribe @ BehaviorSubject.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable._trySubscribe @ Observable.js:38 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subject.js.Subject._trySubscribe @ Subject.js:95 (anonymous) @ Observable.js:32 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 (anonymous) @ filter.js:6 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 (anonymous) @ debounceTime.js:29 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 (anonymous) @ distinct.js:8 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 (anonymous) @ map.js:6 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 (anonymous) @ share.js:60 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 mergeInternals @ mergeInternals.js:53 (anonymous) @ mergeMap.js:14 (anonymous) @ lift.js:10 (anonymous) @ Observable.js:27 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Observable.js.Observable.subscribe @ Observable.js:23 initializeMetadata @ initialize_metadata.ts:44 setup @ plugin.ts:41 setup @ plugin.ts:48 setup @ plugins_service.ts:71 setup @ core_system.ts:262 await in setup __kbnBootstrap__ @ kbn_bootstrap.ts:34 await in __kbnBootstrap__ (anonymous) @ bootstrap.js:136 innerCb @ bootstrap.js:115 load loadScript @ bootstrap.js:105 (anonymous) @ bootstrap.js:124 load @ bootstrap.js:111 window.onload @ bootstrap.js:133 load (anonymous) @ bootstrap.js:47 Show 92 more frames Show less ldclient.cjs.js:1 error: [LaunchDarkly] Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. console_appender.ts:31 [2024-08-19T19:42:43.614+02:00][ERROR][feature-flags-service.open-feature] Error running launchdarkly-client-provider's context change handler: Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. feature_flags_service.ts:56 GET https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 l @ ldclient.cjs.js:1 Qe.c.fetchFlagSettings @ ldclient.cjs.js:1 (anonymous) @ ldclient.cjs.js:1 Promise.then (anonymous) @ ldclient.cjs.js:1 initialize @ ldclient.cjs.js:1 Nt @ ldclient.cjs.js:1 (anonymous) @ index.cjs.js:278 (anonymous) @ index.cjs.js:46 __awaiter @ index.cjs.js:42 initialize @ index.cjs.js:275 setAwaitableProvider @ index.js:595 (anonymous) @ index.js:681 (anonymous) @ index.js:69 __async @ index.js:53 setProviderAndWait @ index.js:670 setProvider @ feature_flags_service.ts:56 setup @ plugin.ts:50 setup @ plugin.ts:48 setup @ plugins_service.ts:71 setup @ core_system.ts:262 await in setup __kbnBootstrap__ @ kbn_bootstrap.ts:34 await in __kbnBootstrap__ (anonymous) @ bootstrap.js:136 innerCb @ bootstrap.js:115 load loadScript @ bootstrap.js:105 (anonymous) @ bootstrap.js:124 load @ bootstrap.js:111 window.onload @ bootstrap.js:133 load (anonymous) @ bootstrap.js:47 Show 20 more frames Show less ldclient.cjs.js:1 error: [LaunchDarkly] Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIiwiaGFzX2RhdGEiOmZhbHNlfSwib3JnYW5pemF0aW9uIjp7ImtleSI6IjEyMzQ1IiwiaXNfZWxhc3RpY19zdGFmZiI6dHJ1ZX19 feature_flags_service.ts:155 GET https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIiwiaGFzX2RhdGEiOmZhbHNlfSwib3JnYW5pemF0aW9uIjp7ImtleSI6IjEyMzQ1IiwiaXNfZWxhc3RpY19zdGFmZiI6dHJ1ZX19 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 l @ ldclient.cjs.js:1 Qe.c.fetchFlagSettings @ ldclient.cjs.js:1 (anonymous) @ ldclient.cjs.js:1 Promise.then identify @ ldclient.cjs.js:1 (anonymous) @ index.cjs.js:311 (anonymous) @ index.cjs.js:46 __awaiter @ index.cjs.js:42 onContextChange @ index.cjs.js:309 (anonymous) @ index.js:811 (anonymous) @ index.js:69 __async @ index.js:53 runProviderContextChangeHandler @ index.js:806 (anonymous) @ index.js:728 (anonymous) @ index.js:728 (anonymous) @ index.js:69 __async @ index.js:53 setContext @ index.js:702 appendContext @ feature_flags_service.ts:155 appendContext @ feature_flags_service.ts:58 (anonymous) @ initialize_metadata.ts:40 doInnerSub @ mergeInternals.js:19 outerNext @ mergeInternals.js:14 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ Subject.js:41 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subject.js.Subject.next @ Subject.js:31 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/ReplaySubject.js.ReplaySubject.next @ ReplaySubject.js:28 next @ share.js:46 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.ConsumerObserver.next @ Subscriber.js:96 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber._next @ Subscriber.js:63 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ map.js:7 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ distinct.js:12 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 emit @ debounceTime.js:16 emitWhenIdle @ debounceTime.js:27 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction._execute @ AsyncAction.js:62 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.execute @ AsyncAction.js:50 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js.AsyncScheduler.flush @ AsyncScheduler.js:21 setInterval setInterval @ intervalProvider.js:12 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.requestAsyncId @ AsyncAction.js:33 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.schedule @ AsyncAction.js:28 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Scheduler.js.Scheduler.schedule @ Scheduler.js:10 (anonymous) @ debounceTime.js:33 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ filter.js:6 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ Subject.js:41 errorContext @ errorContext.js:19 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subject.js.Subject.next @ Subject.js:31 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js.BehaviorSubject.next @ BehaviorSubject.js:31 (anonymous) @ metadata_service.ts:90 await in (anonymous) (anonymous) @ exhaustMap.js:21 OperatorSubscriber._this._next @ OperatorSubscriber.js:15 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/Subscriber.js.Subscriber.next @ Subscriber.js:34 (anonymous) @ timer.js:25 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction._execute @ AsyncAction.js:62 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js.AsyncAction.execute @ AsyncAction.js:50 __kbnSharedDeps_npm__.../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js.AsyncScheduler.flush @ AsyncScheduler.js:21 Show 66 more frames Show less ldclient.cjs.js:1 error: [LaunchDarkly] Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. console_appender.ts:31 [2024-08-19T19:42:44.417+02:00][ERROR][feature-flags-service.open-feature] Error running launchdarkly-client-provider's context change handler: Environment not found. Double check that you specified a valid environment/client-side ID. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. ldclient.cjs.js:1 debug: [LaunchDarkly] sending 1 events xhr-patch.js:94 POST https://events.launchdarkly.com/events/bulk/668ea35e5dd98d109e1bc7d 404 (Not Found) (anonymous) @ xhr-patch.js:94 proto. @ patch-utils.js:54 (anonymous) @ ldclient.cjs.js:1 Ot @ ldclient.cjs.js:1 n.httpRequest @ ldclient.cjs.js:1 t @ ldclient.cjs.js:1 o.sendEvents @ ldclient.cjs.js:1 Ue.a.flush @ ldclient.cjs.js:1 e @ ldclient.cjs.js:1 Show 9 more frames Show less ldclient.cjs.js:1 error: [LaunchDarkly] Received error 404 for event posting - giving up permanently
With a valid SDK key (server side)
[DEBUG][plugins.featureFlagsExample] "/Users/afharo/Developer/elastic/kibana/examples/feature_flags_example/server" does not export "config". {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments] Initializing plugin {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments.launch-darkly] Started EventProcessor. {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.featureFlagsExample] Initializing plugin {"service":{"node":{"roles":["background_tasks","ui"]}}} [INFO ][plugins.featureFlagsExample] The observed feature flags are: - example-boolean: false - example-string: red - example-number: 1 {"service":{"node":{"roles":["background_tasks","ui"]}}} [INFO ][plugins.featureFlagsExample] The feature flags are: - example-boolean: false - example-string: white - example-number: 1 {"service":{"node":{"roles":["background_tasks","ui"]}}} [INFO ][plugins.cloudExperiments.launch-darkly] Opened LaunchDarkly stream connection {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments.launch-darkly] Received put event {"service":{"node":{"roles":["background_tasks","ui"]}}} [DEBUG][plugins.cloudExperiments.launch-darkly] Initializing all data {"service":{"node":{"roles":["background_tasks","ui"]}}}
With a valid client ID (browser side)
feature_flags_service.ts:56 warn: [LaunchDarkly] The waitForInitialization function was called without a timeout specified. In a future version a default timeout will be applied. ldclient.cjs.js:1 debug: [LaunchDarkly] sending diagnostic event (diagnostic-combined) ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "identify" event ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d0/contexts/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d0/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIn0sIm9yZ2FuaXphdGlvbiI6eyJrZXkiOiIxMjM0NSIsImlzX2VsYXN0aWNfc3RhZmYiOnRydWV9fQ ldclient.cjs.js:1 info: [LaunchDarkly] LaunchDarkly client initialized ldclient.cjs.js:1 info: [LaunchDarkly] Opening stream connection to https://clientstream.launchdarkly.com/eval/668ea35e5dd98d109e1bc7d0/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "identify" event ldclient.cjs.js:1 info: [LaunchDarkly] Closing stream connection ldclient.cjs.js:1 info: [LaunchDarkly] Opening stream connection to https://clientstream.launchdarkly.com/eval/668ea35e5dd98d109e1bc7d0/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIn0sIm9yZ2FuaXphdGlvbiI6eyJrZXkiOiIxMjM0NSIsImlzX2VsYXN0aWNfc3RhZmYiOnRydWV9fQ ldclient.cjs.js:1 debug: [LaunchDarkly] received streaming update for all flags ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d0/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIiwiaGFzX2RhdGEiOmZhbHNlfSwib3JnYW5pemF0aW9uIjp7ImtleSI6IjEyMzQ1IiwiaXNfZWxhc3RpY19zdGFmZiI6dHJ1ZX19 ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "identify" event ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "feature" event ldclient.cjs.js:1 info: [LaunchDarkly] Closing stream connection ldclient.cjs.js:1 info: [LaunchDarkly] Opening stream connection to https://clientstream.launchdarkly.com/eval/668ea35e5dd98d109e1bc7d0/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIiwiaGFzX2RhdGEiOmZhbHNlfSwib3JnYW5pemF0aW9uIjp7ImtleSI6IjEyMzQ1IiwiaXNfZWxhc3RpY19zdGFmZiI6dHJ1ZX19 ldclient.cjs.js:1 debug: [LaunchDarkly] received streaming update for all flags ldclient.cjs.js:1 debug: [LaunchDarkly] sending 4 events
Intentionally providing a malformed context (missing mandatory `key`) (browser only: server didn't complain)
feature_flags_service.ts:56 warn: [LaunchDarkly] The waitForInitialization function was called without a timeout specified. In a future version a default timeout will be applied. ldclient.cjs.js:1 debug: [LaunchDarkly] enqueueing "identify" event ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d0/contexts/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 2feature_flags_service.ts:155 error: [LaunchDarkly] The EvaluationContext must contain either a 'targetingKey' or a 'key' and the type must be a string. ldclient.cjs.js:1 error: [LaunchDarkly] Invalid context specified. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. console_appender.ts:31 [2024-08-19T19:48:16.369+02:00][ERROR][feature-flags-service.open-feature] Error running launchdarkly-client-provider's context change handler: Invalid context specified. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. ldclient.cjs.js:1 info: [LaunchDarkly] LaunchDarkly client initialized ldclient.cjs.js:1 info: [LaunchDarkly] Opening stream connection to https://clientstream.launchdarkly.com/eval/668ea35e5dd98d109e1bc7d0/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9 ldclient.cjs.js:1 debug: [LaunchDarkly] received streaming update for all flags 2feature_flags_service.ts:155 error: [LaunchDarkly] The EvaluationContext must contain either a 'targetingKey' or a 'key' and the type must be a string. ldclient.cjs.js:1 error: [LaunchDarkly] Invalid context specified. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. console_appender.ts:31 [2024-08-19T19:48:17.140+02:00][ERROR][feature-flags-service.open-feature] Error running launchdarkly-client-provider's context change handler: Invalid context specified. Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initialize-the-client for instructions on SDK initialization. ldclient.cjs.js:1 debug: [LaunchDarkly] sending 1 events
NB: kibana.yml
config used
logging.appenders.console-with-meta:
type: console
layout:
type: pattern
pattern: '[%level][%logger] %message %meta'
logging.root.level: off
logging.loggers:
- name: plugins.cloudExperiments
level: debug
appenders: [ console-with-meta ]
- name: plugins.featureFlagsExample
level: debug
appenders: [ console-with-meta ]
- name: feature-flags-service
level: debug
appenders: [ console-with-meta ]
xpack.cloud_integrations.experiments.launch_darkly.client_log_level: debug
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, thanks for trying all these configurations! Everything looks safe to me, but I'm not sure about these lines:
feature_flags_service.ts:155 GET https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d/contexts/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIn0sIm9yZ2FuaXphdGlvbiI6eyJrZXkiOiIxMjM0NSIsImlzX2VsYXN0aWNfc3RhZmYiOnRydWV9fQ 404 (Not Found)
ldclient.cjs.js:1 debug: [LaunchDarkly] polling for feature flags at https://app.launchdarkly.com/sdk/evalx/668ea35e5dd98d109e1bc7d0/contexts/eyJhbm9ueW1vdXMiOnRydWUsImtleSI6ImJmYjBiMjYwLTQzOGUtMTFlZi05OGJmLTFmNTk2ODdjY2ZmOCJ9
ldclient.cjs.js:1 info: [LaunchDarkly] Opening stream connection to https://clientstream.launchdarkly.com/eval/668ea35e5dd98d109e1bc7d0/eyJraW5kIjoibXVsdGkiLCJraWJhbmEiOnsia2V5IjoiMTIzNCIsIm9mZmVyaW5nIjoidHJhZGl0aW9uYWwiLCJ2ZXJzaW9uIjoiOC4xNi4wIiwiYnVpbGRfbnVtIjo5MDA3MTk5MjU0NzQwOTkxLCJidWlsZF9zaGEiOiJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYIiwiYnVpbGRfc2hhX3Nob3J0IjoiWFhYWFhYWFhYWFhYIiwiaGFzX2RhdGEiOmZhbHNlfSwib3JnYW5pemF0aW9uIjp7ImtleSI6IjEyMzQ1IiwiaXNfZWxhc3RpY19zdGFmZiI6dHJ1ZX19
These are JWTs in the URLs. Do we treat them as non-secrets and are okay with exposing them in our logs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMO, the information shipped to LaunchDarkly should never include secrets. After all, it's a 3rd-party, and we don't have full control of how they treat the data. Do you think anything listed in the context should be considered a secret?
If we ever consider sending anything potentially problematic, we can use private attributes.
OTOH, those URLs are also visible in the Browser's Network tab, correct? Logging them in case of an error is not a big difference. If we want to remove the context from the URL, LaunchDarkly offers the option useReport: true
: it uses the REPORT
verb and ships the context in the body.
TBH, I was surprised that, while it initially looks like a preferred option, it's not enabled by default. Then I noticed that the docs claim that using this feature requires a custom polyfill for EventSource. The docs of the polyfill claim that it's not optimized for browsers 🤦
Somehow, a custom polyfill to replace the native EventSource seems more risky to me.
WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you think anything listed in the context should be considered a secret?
What I see in those JWTs from the logs doesn't look sensitive to me, but I wasn't sure a) if that's everything they can contain or not, and b) what an adversary could do if they got access to this token. Is the JWT payload basically what's described as "context" in the RFC?
If we ever consider sending anything potentially problematic, we can use private attributes.
Agreed.
OTOH, those URLs are also visible in the Browser's Network tab, correct?
You tell me, I don't know 🙂
Logging them in case of an error is not a big difference.
If it's the case, then yeah, agree.
Somehow, a custom polyfill to replace the native EventSource seems more risky to me.
++
All in all, I think my confusion/concern comes from not knowing much about these JWTs and not being sure what they're used for. But if they’re just carriers for the "context", then it should be fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the JWT payload basically what's described as "context" in the RFC?
Yes, the base64 payload only includes the context: https://github.com/launchdarkly/js-sdk-common/blob/7d49d9e6e5c14683ab7fa47d00bbcf4875f2f015/src/Requestor.js#L90-L96
And the context we expect to ship is the one declared in the RFC doc.
OTOH, those URLs are also visible in the Browser's Network tab, correct?
You tell me, I don't know 🙂
Haha! Yes! I can confirm that I can see those requests listed in the network tab. When they fail, Chrome logs them in the browser as well.
@@ -14,14 +14,14 @@ pageLoadAssetSize: | |||
cloudChat: 19894 | |||
cloudDataMigration: 19170 | |||
cloudDefend: 18697 | |||
cloudExperiments: 59358 | |||
cloudExperiments: 109746 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Everything has a price 🙈
core | ||
.getStartServices() | ||
.then(([{ featureFlags }]) => | ||
featureFlags.getStringValue<ChatVariant>('cloud-chat.chat-variant', 'header') | ||
), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree! That being said, we probably can update this plugin to get this flag from the "chat route" request context instead? It will be even more cleaner without getStartServices
!
try { | ||
await featureFlags.appendContext(userMetadata); | ||
} catch (err) { | ||
logger.warn(`Failed to set the feature flags context ${err}`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: can this error contain anything sensitive that we don't want to record in our logs? If so, maybe just recording err.message
would be enough?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refer to #188562 (comment) for log examples (the last example should contain this warning)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, looks good!
flags, | ||
flagNames: Object.keys(flags), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: is there any benefit in returning both flags
(keys & values) and flagNames
(just keys) at the same time?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the flagNames are indexed as keyword
, so one can ask give me all the deployments that can see my-awesome-flag
by querying flagNames: "my-awesome-flag"
.
Querying flags.my-awesome-flag: *
is not 100% reliable if the evaluated value for that key is falsy to Lucene (empty string or null
).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got it, thanks! Makes sense to me, I didn't realize that the result of getAllFlags
is consumed directly for indexing without intermediate steps where we could do Object.keys(flags)
right before indexing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Observability Onboarding ✅ Thank you for the changes!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
💛 Build succeeded, but was flaky
Failed CI StepsMetrics [docs]Module Count
Public APIs missing comments
Async chunks
Page load bundle
Unknown metric groupsAPI count
async chunk count
ESLint disabled line counts
References to deprecated APIs
Total ESLint disabled count
Unreferenced deprecated APIs
History
To update your PR or re-run it, just comment with: cc @afharo |
💔 All backports failed
Manual backportTo create the backport manually run:
Questions ?Please refer to the Backport tool documentation |
commit 6d568b0 Merge: 1b0aa69 eabb102 Author: Elastic Machine <elasticmachine@users.noreply.github.com> Date: Thu Sep 19 12:01:52 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit eabb102 Author: Julia <iuliia.guskova@elastic.co> Date: Thu Sep 19 10:28:48 2024 +0200 [ResponseOps][MW] Add telemetry for the maintenance window (elastic#192483) Resolve: elastic#184088 In this PR add telemetry collection of these metrics: - total number of MW in deployments - number of active MW with "repeat" toggle on (time based) - number of active MW with "filter alerts" toggle on (KQL based) ## Testing Create several MW with different settings (toggles on and off) To test changes reflected in telemetry object, modify this file: `x-pack/plugins/alerting/server/usage/task.ts` With: ``` async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContract) { try { await taskManager.ensureScheduled({ id: TASK_ID, taskType: TELEMETRY_TASK_TYPE, state: emptyState, params: {}, schedule: SCHEDULE, }); } catch (e) { logger.error(`Error scheduling ${TASK_ID}, received ${e.message}`); } await taskManager.runSoon(TASK_ID); } ``` This will cause the telemetry to be sent as soon as the server is restarted. **Run Telemetry usage payload API in your browser console to verify telemetry object:** https://docs.elastic.dev/telemetry/collection/snapshot-telemetry#telemetry-usage-payload-api P.S.: Add space at the beginning of URL ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> commit 210f552 Author: Yulia Čech <6585477+yuliacech@users.noreply.github.com> Date: Thu Sep 19 10:25:33 2024 +0200 [Ingest Pipelines] Fixes processors description (elastic#193183) ## Summary Fixes elastic#191530 This PR adds a stringify helper that is safe to use with objects, arrays, text and numbers. `set` and `append` processors are using this new helper to display `value` in the processor description. Other type of processors don't seem to need it. This PR fixes the pipeline page so that other processors in the pipeline still can be edited via UI. This PR however doesn't fix the processors forms: both processors currently can't handle json objects when editing. This should be fix in a [separate issue](elastic#193186). ### Screenshots <img width="586" alt="Screenshot 2024-09-17 at 16 54 18" src="https://github.com/user-attachments/assets/e1eb64a3-975c-4db7-98a5-b872ec1b016d"> <img width="586" alt="Screenshot 2024-09-17 at 16 54 34" src="https://github.com/user-attachments/assets/ac57406f-ff22-461e-b788-6bdb2d18d7e9"> ### How to test Use this commands in Console to create processors with a json in `value`. ``` PUT _ingest/pipeline/test2 { "processors": [ { "set" : { "field" : "payload", "value" : "test", "if" : "ctx.payload == \"-\"" } } ] } PUT _ingest/pipeline/test1 { "processors": [ { "append": { "field": "test", "value": { "redacted": true } } } ] } ``` ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### 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 | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit c676d2b Author: natasha-moore-elastic <137783811+natasha-moore-elastic@users.noreply.github.com> Date: Thu Sep 19 09:13:14 2024 +0100 Improves Exceptions API docs content (elastic#193040) ## Summary Resolves elastic/security-docs-internal#33 by improving the Exceptions API docs content. Adds missing and improves existing operation summaries and operation descriptions to adhere to our [OAS standards](https://elasticco.atlassian.net/wiki/spaces/DOC/pages/450494532/API+reference+docs). --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 9765f73 Author: natasha-moore-elastic <137783811+natasha-moore-elastic@users.noreply.github.com> Date: Thu Sep 19 09:03:59 2024 +0100 Improves Timeline API docs content (elastic#192744) ## Summary Resolves elastic/security-docs-internal#35 by improving the Timeline API docs content. Adds missing and improves existing operation summaries and operation descriptions to adhere to our [OAS standards](https://elasticco.atlassian.net/wiki/spaces/DOC/pages/450494532/API+reference+docs). --------- Co-authored-by: Jatin Kathuria <jtn.kathuria@gmail.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit f47987f Author: Alex Szabo <alex.szabo@elastic.co> Date: Thu Sep 19 09:53:15 2024 +0200 [ci] skip FTRs that fail on chrome 129 (elastic#193293) ## Summary `google-chrome-stable` is now on version 129. Another set of tests started to fail when running against a VM with unpinned chrome version: https://buildkite.com/elastic/kibana-pull-request/builds/235162 This PR skips another 3 tests and adjusts all messages to point to the central issue. Relates to: elastic/kibana-operations#199 commit 854cb15 Author: Walter Rafelsberger <walter.rafelsberger@elastic.co> Date: Thu Sep 19 08:10:38 2024 +0200 [ML] Anomaly Detection: Adds popover links menu to anomaly explorer charts. (elastic#186587) ## Summary Adds support for clicking on Anomaly Explorer charts to trigger the actions popover menu. - [x] ExplorerChartSingleMetric - [x] ExplorerChartDistribution - [x] Support for embedded charts Anomaly Explorer [ml-anomaly-charts-actions-0001.webm](https://github.com/elastic/kibana/assets/230104/9502b234-7df8-4290-9914-163936487af8) Embedding [ml-anomaly-charts-actions-embedding-0001.webm](https://github.com/elastic/kibana/assets/230104/ee519b47-e924-4947-b127-4f3ecf62616e) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit 32d751f Author: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu Sep 19 15:07:39 2024 +1000 [api-docs] 2024-09-19 Daily api_docs build (elastic#193382) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/835 commit 2efd0f0 Author: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Thu Sep 19 05:53:05 2024 +0200 [ES|QL] Implement `OrderExpression` for `SORT` command arguments (elastic#189959) ## Summary Closes elastic#189491 - Adds *order expression* AST nodes, which are minted from `SORT` command. - Improves SORT command autocomplete suggestions. Shows fields on first space: <img width="791" alt="image" src="https://github.com/user-attachments/assets/3fec96b4-4e61-4212-a856-ace7a33d9755"> It now shows `NULLS FIRST` and `NULLS LAST`, even before `ASC` or `DESC` was entered, as `ASC` and `DESC` are optional: <img width="871" alt="image" src="https://github.com/user-attachments/assets/4b6d6c28-a7b0-4ac0-bafc-133df1207d54"> Once `ASC` or `DESC` is entered, shows only nulls options: <img width="911" alt="image" src="https://github.com/user-attachments/assets/5b27bd3d-ccdc-4bd0-b09f-fe65e5975e28"> It also now suggests partial modifier, if the in-progress text that user is typing matches it: <img width="504" alt="image" src="https://github.com/user-attachments/assets/9a047c40-b49b-4694-8477-7270cb9c0886"> (However, we are not triggering autocomplete in those cases in UI, so no way to see it in UI right now.) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 6f4be61 Author: Dominique Clarke <dominique.clarke@elastic.co> Date: Wed Sep 18 21:32:45 2024 -0400 [Synthetics] waterfall chart - handle cached resources (elastic#193089) ## Summary Resolves elastic#184794 Ensures that the cached resources display accurate timing information on the waterfall chart tooltips. The information displayed should match the information displayed in the flyout when the request url is clicked. Tooltip <img width="555" alt="Screenshot 2024-09-16 at 8 49 55 PM" src="https://github.com/user-attachments/assets/516653bc-dcec-4681-965b-08711417ab67"> Flyout <img width="424" alt="Screenshot 2024-09-16 at 2 07 56 PM" src="https://github.com/user-attachments/assets/5fb0bf1c-c65d-4ce3-8a6a-5e95700209dd"> ### Release note Synthetics - resolves an issue for multi step browser journeys where timings for cached resources within the same step were inaccurate within the waterfall chart. ### Testing 1. Create a browser monitor with duplicate requests. For example: ``` step("multi resource step", async () => { await page.goto('https://github.com'); await page.goto('https://github.com'); await page.goto('https://github.com'); }) ``` 2. Navigate to the monitor details page 3. Find the last test run panel, click the view test details button, then click the view performance breakdown button ![image](https://github.com/user-attachments/assets/b66addcb-21f6-4eac-8c60-dc3387b33853) ![image](https://github.com/user-attachments/assets/67f04b9f-4ff6-4ce6-85d1-2a89869e4a2c) 4. Scroll down to the waterfall chart. If you use github, requests after about 115 should be cached. Note: some request may have been aborted and their waterfall tooltip won't show. Find a request that was not aborted, hover to see the tooltip, then click the request to view the flyout and confirm the information. commit f810bb5 Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 18:40:34 2024 -0500 Update docker.elastic.co/wolfi/chainguard-base:latest Docker digest to 6fbf078 (main) (elastic#193356) This PR contains the following updates: | Package | Update | Change | |---|---|---| | docker.elastic.co/wolfi/chainguard-base | digest | `d4def25` -> `6fbf078` | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJUZWFtOk9wZXJhdGlvbnMiLCJyZWxlYXNlX25vdGU6c2tpcCJdfQ==--> Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit 10f86c6 Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 18:38:57 2024 -0500 Update dependency msw to ^2.4.5 (main) (elastic#193363) This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.4` -> `^2.4.5`](https://renovatebot.com/diffs/npm/msw/2.4.6/2.4.5) | `2.4.8` (+2) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJUZWFtOkNsb3VkIFNlY3VyaXR5IiwiYmFja3BvcnQ6c2tpcCIsInJlbGVhc2Vfbm90ZTpza2lwIl19--> Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit bcc42d5 Author: Philippe Oberti <philippe.oberti@elastic.co> Date: Thu Sep 19 01:02:36 2024 +0200 [kbn-expandable-flyout] - add support for resizable flyout (elastic#192906) commit 3bea483 Author: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Wed Sep 18 17:56:10 2024 -0400 [Security Solution] Adds enable on install UI workflow to prebuilt rules page (elastic#191529) ## Summary Adds overflow button UI to all prebuilt rules install buttons in order to enable the rule when it is successfully installed. Previously, a user would have to navigate back to the rules page and find the rule(s) they just installed to enable, this combines those two workflows into a single button action - speeding up the out of the box rule implementation. ### Screenshots **Prebuilt rules table columns** <img width="530" alt="Screenshot 2024-09-04 at 10 38 05 AM" src="https://github.com/user-attachments/assets/4a009afa-a8f0-4eaa-a76b-8f4e509f35a3"> **Prebuilt rules table bulk install** <img width="1478" alt="Screenshot 2024-09-04 at 10 38 16 AM" src="https://github.com/user-attachments/assets/eb6deb9b-9b4e-4be3-a4ac-0da06d6f1e8e"> **Prebuilt rule details flyout** <img width="1489" alt="Screenshot 2024-09-04 at 10 38 44 AM" src="https://github.com/user-attachments/assets/a4bce22d-7e90-42e4-8522-cf411a297659"> ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) commit 4c51c00 Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 16:10:45 2024 -0500 Update dependency msw to ^2.4.4 (main) (elastic#192955) This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.2` -> `^2.4.4`](https://renovatebot.com/diffs/npm/msw/2.4.2/2.4.4) | `2.4.8` (+3) | --- ### Release Notes <details> <summary>mswjs/msw (msw)</summary> ### [`v2.4.4`](https://togithub.com/mswjs/msw/releases/tag/v2.4.4) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.3...v2.4.4) #### v2.4.4 (2024-09-08) ##### Bug Fixes - **fetch:** follow mocked redirect responses ([#&elastic#8203;2268](https://togithub.com/mswjs/msw/issues/2268)) ([`f5785bf`](https://togithub.com/mswjs/msw/commit/f5785bfba1a026075feca4f74cadfcb636ffc257)) [@&elastic#8203;kettanaito](https://togithub.com/kettanaito) - Adopts a new, Socket-based request interception algorithm. ### [`v2.4.3`](https://togithub.com/mswjs/msw/releases/tag/v2.4.3) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.2...v2.4.3) #### v2.4.3 (2024-09-07) ##### Bug Fixes - revert "graphql" as optional peer dependency ([#&elastic#8203;2267](https://togithub.com/mswjs/msw/issues/2267)) ([`7cd39e7`](https://togithub.com/mswjs/msw/commit/7cd39e787aa9766eef914bce3d65daec1ce16635)) [@&elastic#8203;kettanaito](https://togithub.com/kettanaito) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJUZWFtOkNsb3VkIFNlY3VyaXR5IiwiYmFja3BvcnQ6c2tpcCIsInJlbGVhc2Vfbm90ZTpza2lwIl19--> Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit 798a26f Author: Steph Milovic <stephanie.milovic@elastic.co> Date: Wed Sep 18 15:05:41 2024 -0600 [Security solution] `naturalLanguageToEsql` Tool added to default assistant graph (elastic#192042) commit d4ee1ca Author: Justin Kambic <jk@elastic.co> Date: Wed Sep 18 16:51:52 2024 -0400 [Synthetics] Remove dead code (elastic#193335) ## Summary Gets rid of unused files and some types, constants, etc. that are no longer referenced in production code. commit 91ca8ab Author: Eyo O. Eyo <7893459+eokoneyo@users.noreply.github.com> Date: Wed Sep 18 22:26:44 2024 +0200 [Reporting] update puppeteer to version 23.3.1 (elastic#192345) ## Summary Update for puppeteer, the following changeset updates puppeteer to version `23.3.1`. The chromium version required for this version of puppeteer is `128.0.6613.137` from revision `1331488`, as such the chromium binary included for windows and darwin platforms either match or were the closest revision to the expectation. The linux headless binary was built from commit `fe621c5aa2d6b987e964fb1b5066833da5fb613d` of the same revision. _**N.B.**_ Puppeteer 23.0.0 is earmarked as containing breaking changes see [here](https://github.com/puppeteer/puppeteer/blob/abda5dcc9912f4fa2c5a566403108db783f48538/packages/puppeteer-core/CHANGELOG.md#2300-2024-08-07), this PR considers the outlined changes and makes relevant adjustments so reporting continues working as is. <!-- ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### 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 | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --> ### How to verify linux headless build - clone the following repo https://github.com/tsullivan/kibana-dev-docker - pull this particular PR - follow the steps outlined in the repo, replacing any occurrence of `kibana-<version>-SNAPSHOT-linux-aarch64.tar.gz` from the repo above's step with the output of running build on this changeset. - before running step 4, modify the `kibana.yml` file from the `kibana-dev-docker` repo and include the following so we might be able to verify the version of chromium running; ```yaml logging.loggers: - name: plugins.reporting level: debug ``` - complete the steps outlined in the README, you'll have a linux distro of kibana running on port `5601` - Attempt creating exports of PDF and PNG reports, in dashboard, canvas, and visualizations, on report creation attempt we would see a log output that prints out the chromium version exactly matching this; <img width="1326" alt="Screenshot 2024-09-18 at 14 50 19" src="https://github.com/user-attachments/assets/7206781a-e8f9-469c-ad65-fd13749766b2"> --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> commit d84eda1 Author: Justin Kambic <jk@elastic.co> Date: Wed Sep 18 16:07:29 2024 -0400 [Uptime] Delete dead code (elastic#193339) ## Summary Removes code that is unused from the Uptime plugin. commit 3c01b13 Author: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Wed Sep 18 11:53:36 2024 -0700 [ResponseOps] Connector OAS for framework fields (elastic#192767) Resolves elastic#192778 ## Summary This PR updates the following `response` schemas as well as the legacy route schemas for connector APIs to generate OAS documentation: - `POST /api/actions/connector/{id?}` - `GET /api/actions/connector/{id}` - `POST /api/actions/connector/{id}/_execute` - `PUT /api/actions/connector/{id}` The `request` schemas were updated in this [PR](elastic#191678). ### To verify 1. Start ES 2. Add `server.oas.enabled: true` to `kibana.dev.yml` 3. Start Kibana `yarn start --no-base-path` 4. `curl -s -uelastic:changeme http://localhost:5601/api/oas\?pathStartsWith\=/api/actions/ | jq` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Lisa Cawley <lcawley@elastic.co> commit e1db296 Author: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Wed Sep 18 20:39:25 2024 +0200 [Lens] Corrects incorrect copy for line chart & fix flaky test (elastic#192734) ## Summary Corrects incorrect copy for line chart. Rewrites some of the tests to rtl. Unskips flaky or failing tests. Fixes elastic#192476 Removes some errors from the console that appear during unit test running. --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> commit 4d4afa5 Author: Rickyanto Ang <rickyangwyn@gmail.com> Date: Wed Sep 18 10:55:00 2024 -0700 [Cloud Security] User Name Misconfiguration Table and Preview Contextual Flyout (elastic#192946) ## Summary This PR is the implementation of Misconfiguration Preview and Data table on user.name flyout in Alerts Page. <img width="1717" alt="Screenshot 2024-09-14 at 12 54 37 AM" src="https://github.com/user-attachments/assets/ad405a4a-9820-4bb1-87f0-7e915eeb003b"> How to test: Pre req: In order to test this, you need to generate some fake alerts. This [repo](https://github.com/elastic/security-documents-generator) will help you do that 1. Generate Some Alerts 2. Use the Reindex API to get some Findings data in (change the host.name field to match the host.name from alerts generated if you want to test Findings table in the left panel flyout) 3. Turn on Risky Entity Score if you want to test if both Risk Contribution and Insights tabs shows up, follow this [guide](https://www.elastic.co/guide/en/security/current/turn-on-risk-engine.html) to turn on Risk Entity Score commit b9d7de6 Author: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed Sep 18 12:53:01 2024 -0500 Update OpenFeature (main) (elastic#193332) Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> commit be2d641 Author: Katerina <aikaterini.patticha@elastic.co> Date: Wed Sep 18 20:50:22 2024 +0300 [Inventory] Remove inventory dependency from observability plugin (elastic#193251) ## Summary closes elastic#193200 - Remove inventory dependency from observability plugin - Register inventory in different section in classic stateful sidenav https://github.com/user-attachments/assets/6c9c28bc-7483-4deb-b95a-67585a92f89f commit f40bf52 Author: Melissa Alvarez <melissa.alvarez@elastic.co> Date: Wed Sep 18 11:04:17 2024 -0600 [ML] Serverless Security: Adds ES|QL visualizer menu item in nav (elastic#192314) ## Summary Related issue: elastic#192307 This PR add sthe ES|QL visualizer menu item to the Security solution's nav in serverless. <img width="546" alt="image" src="https://github.com/user-attachments/assets/239c25c8-63af-4009-8e37-78a99d7b6719"> <img width="1189" alt="image" src="https://github.com/user-attachments/assets/e0ac66d4-4066-4c15-8cac-ff5a5e0ae716"> ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> commit de51a1a Author: Sid <siddharthmantri1@gmail.com> Date: Wed Sep 18 19:01:45 2024 +0200 Add debug logging for flaky session tests (elastic#193279) ## Summary Add settings to the ES Test cluster to enable debug logs so that if this test fails in the future, we will have more logs to investigate the issue. __Related:__ elastic#152260 commit 004631b Author: Tomasz Ciecierski <tomasz.ciecierski@elastic.co> Date: Wed Sep 18 18:56:06 2024 +0200 [EDR Workflows] Automated Actions in more rule types (elastic#191874) commit 70b7d26 Author: Nikita Indik <nikita.indik@elastic.co> Date: Wed Sep 18 18:21:00 2024 +0200 [Security Solution] ThreeWayDiff UI: Migrate to using `DiffableRule` TS type in `FieldReadOnly` component (elastic#192342) **Partially addresses: elastic#171520 **Is a follow-up PR to: elastic#191499 This is the 2nd of the 3 PRs for `FieldReadOnly`. - The 1st [PR](elastic#191499) added the `FieldReadOnly` and a bunch of field components. - This (2nd) PR moves away from using `DiffableAllFields` type in favour of `DiffableRule` and splits the large `FieldReadOnly` component into smaller ones for readability. - Next (3rd) PR will add the remaining field components. ## Summary This PR changes the TS type (`DiffableAllFields` -> `DiffableRule`) used by the `FieldReadOnly` component. This component displays a read-only view of a particular rule field, similar to how fields are shown on the Rule Details page. Using `DiffableRule` type makes the component compatible with the flyout context and is safer to use than `DiffableAllFields`. ### Changes - TS type used in the `FieldReadOnly` component and Storybook stories changed to `DiffableRule`. - `FieldReadOnly` field rendering was split into multiple files by rule type to make it more readable. - Added rule-mocking functions to Storybook to allow creation of `DiffableRule` mocks. - Added field components for `name`, `description` and `tags` fields. - Rewrote type narrowing for `Filters` component to a type guard (`isFilters`). - Fixed a couple of outdated code comments. ### Running `FinalReadOnly` and its field components are not yet integrated into the flyout, but you can view components in Storybook. 1. Run Storybook: `yarn storybook security_solution` 2. Go to `http://localhost:9001` in browser. <img width="1062" alt="Schermafbeelding 2024-09-03 om 13 05 11" src="https://github.com/user-attachments/assets/13b227d4-1321-47d9-a0a7-93868c9f4a15"> commit 02ce1b9 Author: Alejandro Fernández Haro <alejandro.haro@elastic.co> Date: Wed Sep 18 18:02:55 2024 +0200 [Feature Flags Service] Hello world 👋 (elastic#188562) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Jean-Louis Leysens <jloleysens@gmail.com> commit 38d6143 Author: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Wed Sep 18 16:45:59 2024 +0100 [Index Management] Restrict dot-prefixed index patterns in template form (elastic#193196) Closes elastic#190251 ## Summary This PR adds validation that restricts creating a template with a dot-prefixed index pattern. <img width="1194" alt="Screenshot 2024-09-18 at 10 49 47" src="https://github.com/user-attachments/assets/f24c3e29-7db0-46fc-97de-52d4654073de"> Note: I tried adding tests for this validation [here](https://github.com/elastic/kibana/blob/6a3adf73dacaeda073674ac4a10e8a2597e67739/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.test.tsx#L163), but it didn't work because the index pattern field is mocked in the tests and errors are not triggered from invalid values. commit 78b21cd Author: Tre <wayne.seymour@elastic.co> Date: Wed Sep 18 16:31:11 2024 +0100 [Unskip] x-pack/.../summary_actions.ts (elastic#193120) ## Summary Use retryForTime instead. Test against local (fake mki) and mki; both were security projects. Tested against `x-pack/test_serverless/api_integration/test_suites/security/common_configs/config.group1.ts` Resolves: elastic#193061 --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> commit bfbcf62 Author: Kevin Delemme <kevin.delemme@elastic.co> Date: Wed Sep 18 11:25:42 2024 -0400 chore(rca): show full name in notes and store profile id in model (elastic#193211) commit 5bf4501 Author: Tim Sullivan <tsullivan@users.noreply.github.com> Date: Wed Sep 18 08:19:05 2024 -0700 [Spaces Management] Ensure current badge can only appear for single entry (elastic#193195) ## Summary Closes elastic#192811 ### Checklist Delete any items that are not applicable to this PR. - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or commit e3f3c68 Author: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Date: Wed Sep 18 16:06:13 2024 +0100 [Inventory][ECO] Entities table (elastic#193272) Real data: <img width="1237" alt="Screenshot 2024-09-18 at 14 23 17" src="https://github.com/user-attachments/assets/ecc496aa-1c43-4c3c-9ac8-d6e4e6cb8aad"> Storybook: <img width="1256" alt="Screenshot 2024-09-18 at 14 23 22" src="https://github.com/user-attachments/assets/03d9f940-7b3f-4aea-9221-42b1c07119d1"> Tooltips: <img width="1250" alt="Screenshot 2024-09-18 at 13 49 19" src="https://github.com/user-attachments/assets/dc99b4cc-4eba-4815-8892-8e3fe7a041bb"> - Use ESQL to fetch the top 500 entities sorted by last seen property. - Display 20 entities per page. - Sorting is handles by the server and saved on the URL - Current page is saved on the URL - Filter entities types `service`, `host` or `container` - Filter only entities from the built in definition - LIMITATION: The EuiGrid doesn't have an embedded loading state, for now, I'm switching the entire view to display a loading spinner while data is being fetched. - PLUS: Storybook created with mock data. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> commit 5040e35 Author: Sébastien Loix <sebastien.loix@elastic.co> Date: Wed Sep 18 15:54:13 2024 +0100 [Chrome service] Expose handler to toggle the sidenav (elastic#193192) commit 1b0aa69 Merge: 1310ae1 26a50f7 Author: Pablo Machado <pablo.nevesmachado@elastic.co> Date: Wed Sep 18 16:06:10 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit 1310ae1 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Wed Sep 18 14:54:27 2024 +0200 Fix CI commit 7eb1118 Merge: c2b1724 61d0b7f Author: Elastic Machine <elasticmachine@users.noreply.github.com> Date: Wed Sep 18 10:33:28 2024 +0200 Merge branch 'main' into siem-ea-9180-api commit c2b1724 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 17:06:14 2024 +0200 Improve get entity index function commit a8b96d8 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 16:40:48 2024 +0200 Fix build commit 1b94ce7 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 14:47:35 2024 +0200 Add code review suggestions commit 7064282 Author: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Tue Sep 17 12:38:17 2024 +0000 [CI] Auto-commit changed files from 'yarn openapi:bundle' commit ab6e773 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 13:49:10 2024 +0200 Rename User and Host records commit 4216ff3 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 13:45:24 2024 +0200 Fix API tests commit 500b631 Author: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Tue Sep 17 10:17:06 2024 +0000 [CI] Auto-commit changed files from 'yarn openapi:bundle' commit 98250e9 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 17 11:22:28 2024 +0200 Code review improvements commit fbb7479 Author: machadoum <pablo.nevesmachado@elastic.co> Date: Tue Sep 10 13:58:47 2024 +0200 Create list entities API add API test Add data client test
💚 All backports created successfully
Note: Successful backport PRs will be merged automatically after passing CI. Questions ?Please refer to the Backport tool documentation |
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Jean-Louis Leysens <jloleysens@gmail.com> (cherry picked from commit 02ce1b9) # Conflicts: # .github/CODEOWNERS
# Backport This will backport the following commits from `main` to `8.x`: - [[Feature Flags Service] Hello world 👋 (#188562)](#188562) <!--- Backport version: 8.9.8 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Alejandro Fernández Haro","email":"alejandro.haro@elastic.co"},"sourceCommit":{"committedDate":"2024-09-18T16:02:55Z","message":"[Feature Flags Service] Hello world 👋 (#188562)\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Jean-Louis Leysens <jloleysens@gmail.com>","sha":"02ce1b91014eb59f019854b01325bbdf983d2218","branchLabelMapping":{"^v9.0.0$":"main","^v8.16.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Core","Team:Operations","Team:Security","release_note:skip","Team:Observability","Team:Fleet","v9.0.0","Team: SecuritySolution","backport:prev-minor","ci:project-deploy-observability","Team:obs-ux-logs"],"number":188562,"url":"https://github.com/elastic/kibana/pull/188562","mergeCommit":{"message":"[Feature Flags Service] Hello world 👋 (#188562)\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Jean-Louis Leysens <jloleysens@gmail.com>","sha":"02ce1b91014eb59f019854b01325bbdf983d2218"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/188562","number":188562,"mergeCommit":{"message":"[Feature Flags Service] Hello world 👋 (#188562)\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by: Jean-Louis Leysens <jloleysens@gmail.com>","sha":"02ce1b91014eb59f019854b01325bbdf983d2218"}}]}] BACKPORT-->
Summary
Introduces the new Feature Flags Service in Core.
This new service allows Core to integrate with any Feature Flags service provider following OpenFeature specs.
Additional work achieved in this PR:
kibana.yml
config.PUT /internal/core/_settings
).examples/feature_flags_example
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:
For maintainers