@odigos/ui-kit 0.0.67 → 0.0.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/lib/components/dropdown/index.d.ts +2 -1
  3. package/lib/components/field-label/index.d.ts +2 -0
  4. package/lib/components/input/index.d.ts +2 -1
  5. package/lib/components/popup/index.d.ts +3 -2
  6. package/lib/components/text/index.d.ts +1 -1
  7. package/lib/components.js +8 -8
  8. package/lib/constants.js +1 -1
  9. package/lib/containers/system-settings/settings/options.d.ts +2 -1
  10. package/lib/containers/system-settings/settings/types.d.ts +2 -2
  11. package/lib/containers.js +185 -175
  12. package/lib/functions/get-status-icon/index.d.ts +2 -1
  13. package/lib/functions.js +5 -5
  14. package/lib/hooks.js +3 -3
  15. package/lib/icons.js +6 -6
  16. package/lib/{index-58440c5c.js → index-281d9862.js} +2 -2
  17. package/lib/{index-c1df4281.js → index-35e207a1.js} +1 -1
  18. package/lib/{index-acc7c7dd.js → index-5102bee6.js} +1 -1
  19. package/lib/{index-f2da9ad4.js → index-728cf83d.js} +80 -34
  20. package/lib/{index-50101bec.js → index-89b23a82.js} +1 -1
  21. package/lib/{index-bd48e6e2.js → index-8fc2f11e.js} +3 -3
  22. package/lib/{index-7074fb24.js → index-b3808507.js} +2 -2
  23. package/lib/{index-42f40e7c.js → index-ed649685.js} +3 -3
  24. package/lib/{index-391844c6.js → index-fed7fc91.js} +1 -1
  25. package/lib/snippets.js +7 -7
  26. package/lib/store.js +1 -1
  27. package/lib/theme.js +1 -1
  28. package/lib/types/config/index.d.ts +13 -0
  29. package/lib/types.js +25 -1
  30. package/lib/{useTransition-c2aef0e4.js → useTransition-26bd4722.js} +1 -1
  31. package/package.json +15 -15
  32. package/lib/containers/system-settings/settings/advanced-settings.d.ts +0 -4
package/lib/containers.js CHANGED
@@ -1,21 +1,21 @@
1
1
  import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, Fragment, useCallback, Children } from 'react';
2
2
  import styled, { css } from 'styled-components';
3
- import { b as DISPLAY_TITLES, T as Theme, U as usePendingStore, V as useNotificationStore, O as useDrawerStore, B as BUTTON_TEXTS, W as useEntityStore, A as ACTION_OPTIONS, g as getActionIcon, z as useModalStore, F as FORM_ALERTS, X as useFilterStore, D as DISPLAY_LANGUAGES, M as MONITORS_OPTIONS, d as getInstrumentationRuleIcon, Y as useDataStreamStore, Z as useInstrumentStore, c as getEntityId, S as STORAGE_KEYS, a as DEFAULT_DATA_STREAM_NAME, _ as useSetupStore, e as getProgrammingLanguageIcon, I as INSTRUMENTATION_RULE_OPTIONS, $ as useSelectedStore, j as ImageErrorIcon, a0 as useDarkMode } from './index-bd48e6e2.js';
4
- import { ActionType, ActionKeyTypes, InputTypes, FieldTypes, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, EdgeTypes, AddNodeTypes, SignalType, HeadersCollectionKeyTypes, CustomInstrumentationsKeyTypes, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType, K8sResourceKind, MountMethod, AgentEnvVarsInjectionMethod, InstallationMethod } from './types.js';
5
- import { e as DataCardFieldTypes, p as FieldLabel, C as Checkbox, o as FieldError, v as Input, x as InputTable, K as KeyValueInputsList, w as InputList, _ as Text, R as Segment, Q as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, $ as TextArea, k as Drawer, c as ConditionDetails, D as DataCard, a5 as FlexColumn, M as Modal, N as NavigationButtons, a9 as ModalBody, L as NotificationNote, A as AutocompleteInput, i as Divider, W as Status, a4 as FlexRow, a1 as Tooltip, s as IconWrapped, G as MonitorsIcons, aa as TableContainer, ab as TableTitleWrap, r as IconTitleBadge, ac as TableWrap, y as InteractiveTable, a6 as CenterThis, J as NoDataFound, a2 as TraceLoader, a as Badge, E as ExtendArrow, a7 as VerticalScroll, U as SelectionButton, B as Button, n as Dropdown, ad as nodeConfig, ae as useNodesState, af as useEdgesState, ag as Flow, ah as applyNodeChanges, P as Popup, a0 as Toggle, I as IconButton, ai as AddButton, F as FadeLoader, g as DataTab, X as Stepper, d as DataCardFields, Z as Tag, aj as MarkerType, t as IconsNav, ak as CopyText, h as DescribeRow, al as PodContainer, am as SourceContainer, q as IconGroup, O as PopupForm } from './index-f2da9ad4.js';
3
+ import { b as DISPLAY_TITLES, T as Theme, U as usePendingStore, V as useNotificationStore, O as useDrawerStore, B as BUTTON_TEXTS, W as useEntityStore, A as ACTION_OPTIONS, g as getActionIcon, z as useModalStore, F as FORM_ALERTS, X as useFilterStore, D as DISPLAY_LANGUAGES, M as MONITORS_OPTIONS, d as getInstrumentationRuleIcon, Y as useDataStreamStore, Z as useInstrumentStore, c as getEntityId, S as STORAGE_KEYS, a as DEFAULT_DATA_STREAM_NAME, _ as useSetupStore, e as getProgrammingLanguageIcon, I as INSTRUMENTATION_RULE_OPTIONS, $ as useSelectedStore, j as ImageErrorIcon, a0 as useDarkMode } from './index-8fc2f11e.js';
4
+ import { ActionType, ActionKeyTypes, InputTypes, FieldTypes, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, EdgeTypes, AddNodeTypes, SignalType, HeadersCollectionKeyTypes, CustomInstrumentationsKeyTypes, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType, K8sResourceKind, MountMethod, AgentEnvVarsInjectionMethod, Profile, InstallationMethod } from './types.js';
5
+ import { e as DataCardFieldTypes, p as FieldLabel, C as Checkbox, o as FieldError, v as Input, x as InputTable, K as KeyValueInputsList, w as InputList, _ as Text, R as Segment, Q as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, $ as TextArea, k as Drawer, c as ConditionDetails, D as DataCard, a5 as FlexColumn, M as Modal, N as NavigationButtons, a9 as ModalBody, L as NotificationNote, A as AutocompleteInput, i as Divider, W as Status, a4 as FlexRow, a1 as Tooltip, s as IconWrapped, G as MonitorsIcons, aa as TableContainer, ab as TableTitleWrap, r as IconTitleBadge, ac as TableWrap, y as InteractiveTable, a6 as CenterThis, J as NoDataFound, a2 as TraceLoader, a as Badge, E as ExtendArrow, a7 as VerticalScroll, U as SelectionButton, B as Button, n as Dropdown, ad as nodeConfig, ae as useNodesState, af as useEdgesState, ag as Flow, ah as applyNodeChanges, P as Popup, a0 as Toggle, I as IconButton, ai as AddButton, F as FadeLoader, g as DataTab, X as Stepper, d as DataCardFields, Z as Tag, aj as MarkerType, t as IconsNav, ak as CopyText, h as DescribeRow, al as PodContainer, am as SourceContainer, q as IconGroup, O as PopupForm } from './index-728cf83d.js';
6
6
  import { i as isEmpty, s as safeJsonParse, d as deepClone } from './index-5e5f7bda.js';
7
- import { C as CheckCircledIcon, O as OdigosLogo } from './index-50101bec.js';
8
- import { C as CrossCircledIcon, O as OdigosLogoText, a as OverviewIcon, F as FilterIcon, D as DataStreamsIcon, A as ArrowIcon, R as RefreshLeftArrowIcon, N as NotificationIcon, U as UserIcon, S as SlackLogo, K as KeyIcon, T as TerminalIcon, G as GearIcon } from './index-c1df4281.js';
7
+ import { C as CheckCircledIcon, O as OdigosLogo } from './index-89b23a82.js';
8
+ import { C as CrossCircledIcon, O as OdigosLogoText, a as OverviewIcon, F as FilterIcon, D as DataStreamsIcon, A as ArrowIcon, R as RefreshLeftArrowIcon, N as NotificationIcon, U as UserIcon, S as SlackLogo, K as KeyIcon, T as TerminalIcon, G as GearIcon } from './index-35e207a1.js';
9
9
  import { useActionFormData, useSessionStorage, useDataStreamFormData, useDestinationFormData, useClickNotification, useSourceFormData, useSourceSelectionFormData } from './hooks.js';
10
- import { u as useKeyDown, a as useOnClickOutside, b as useContainerSize, c as useClickNode, d as usePopup, e as useInstrumentationRuleFormData, f as useTransition, g as useTimeAgo, h as useCopy, i as useGenericForm } from './useTransition-c2aef0e4.js';
11
- import { E as EditIcon, T as TrashIcon, S as SearchIcon, h as CheckIcon, P as PlusIcon, a as CopyIcon } from './index-391844c6.js';
12
- import { D as DeleteWarning, C as CancelWarning } from './index-7074fb24.js';
13
- import { g as getConditionsBooleans, m as mapConditions, b as getStatusIcon, h as splitCamelString, c as capitalizeFirstLetter, i as isStringABoolean, p as parseBooleanFromString } from './index-58440c5c.js';
14
- import { f as filterActions, l as getEntityLabel, k as getEntityIcon, v as sleep, n as getPlatformIcon, o as getPlatformLabel, g as formatBytes, i as getContainersIcons, p as getValueForRange, j as getDestinationIcon, e as filterSourcesByStream, d as filterSources, b as filterDestinationsByStream, a as filterDestinations, u as mapDestinationFieldsForDisplay, c as compareCondition, r as getYamlFieldsForDestination, m as getMetricForEntity, q as getWorkloadId, s as hasUnhealthyInstances, h as getContainersInstrumentedCount, t as isOverTime } from './index-42f40e7c.js';
10
+ import { u as useKeyDown, a as useOnClickOutside, b as useContainerSize, c as useClickNode, d as usePopup, e as useInstrumentationRuleFormData, f as useTransition, g as useTimeAgo, h as useCopy, i as useGenericForm } from './useTransition-26bd4722.js';
11
+ import { E as EditIcon, T as TrashIcon, S as SearchIcon, h as CheckIcon, P as PlusIcon, a as CopyIcon } from './index-fed7fc91.js';
12
+ import { D as DeleteWarning, C as CancelWarning } from './index-b3808507.js';
13
+ import { g as getConditionsBooleans, m as mapConditions, b as getStatusIcon, h as splitCamelString, c as capitalizeFirstLetter, i as isStringABoolean, p as parseBooleanFromString } from './index-281d9862.js';
14
+ import { f as filterActions, l as getEntityLabel, k as getEntityIcon, v as sleep, n as getPlatformIcon, o as getPlatformLabel, g as formatBytes, i as getContainersIcons, p as getValueForRange, j as getDestinationIcon, e as filterSourcesByStream, d as filterSources, b as filterDestinationsByStream, a as filterDestinations, u as mapDestinationFieldsForDisplay, c as compareCondition, r as getYamlFieldsForDestination, m as getMetricForEntity, q as getWorkloadId, s as hasUnhealthyInstances, h as getContainersInstrumentedCount, t as isOverTime } from './index-ed649685.js';
15
15
  import { m as mapExportedSignals } from './index-6a6bea6e.js';
16
16
  import { NoteBackToSummary, EditButton } from './snippets.js';
17
17
  import { D as DESTINATION_CATEGORIES } from './index-1cb4f9e2.js';
18
- import { a6 as RulesIcon, a7 as SourcesIcon, a3 as ActionsIcon, a4 as DestinationsIcon } from './index-acc7c7dd.js';
18
+ import { a6 as RulesIcon, a7 as SourcesIcon, a3 as ActionsIcon, a4 as DestinationsIcon } from './index-5102bee6.js';
19
19
  import 'react-dom';
20
20
 
21
21
  const buildCard$3 = (action) => {
@@ -4605,7 +4605,7 @@ const ExpiresAt = ({ expiresAt }) => {
4605
4605
  ")"));
4606
4606
  };
4607
4607
 
4608
- const Relative = styled.div `
4608
+ const Relative$1 = styled.div `
4609
4609
  position: relative;
4610
4610
  `;
4611
4611
  const TokenActions = ({ token, saveToken }) => {
@@ -4627,7 +4627,7 @@ const TokenActions = ({ token, saveToken }) => {
4627
4627
  return (React.createElement(FlexRow, { "$gap": 0 },
4628
4628
  React.createElement(IconButton, { size: 32, onClick: () => clickCopy(token) }, isCopied ? React.createElement(SuccessIcon, null) : React.createElement(CopyIcon, null)),
4629
4629
  React.createElement(Divider, { orientation: 'vertical', length: '12px' }),
4630
- React.createElement(Relative, null,
4630
+ React.createElement(Relative$1, null,
4631
4631
  React.createElement(IconButton, { size: 32, onClick: onOpenEdit },
4632
4632
  React.createElement(EditIcon, null)),
4633
4633
  isEdit && (React.createElement(PopupForm, { flipX: true, clientX: 36, isOpen: isEdit, onClose: onCloseEdit, onSave: onSave, title: 'Enter a new API Token', titleTooltip: 'Contact us to generate a new one' },
@@ -4730,7 +4730,6 @@ var SettingsTabs;
4730
4730
  SettingsTabs["Rollback"] = "Rollback";
4731
4731
  SettingsTabs["CollectorNode"] = "Collector Node";
4732
4732
  SettingsTabs["CollectorGateway"] = "Collector Gateway";
4733
- SettingsTabs["Advanced"] = "Advanced";
4734
4733
  })(SettingsTabs || (SettingsTabs = {}));
4735
4734
 
4736
4735
  const Card = styled.div `
@@ -4753,48 +4752,101 @@ const RowOfFields = styled(FlexRow) `
4753
4752
  width: 100%;
4754
4753
  gap: 12px;
4755
4754
  align-items: flex-start;
4755
+ justify-content: space-between;
4756
4756
  `;
4757
4757
 
4758
- const UiSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4758
+ const UiSettings = forwardRef(({ isAdvanced, formData, handleFormChange }, ref) => {
4759
4759
  return (React.createElement(Card, { ref: ref, id: SettingsTabs.Ui },
4760
- React.createElement(CardTitle, null, "UI"),
4761
- React.createElement(Input, { title: 'Central Backend URL', tooltip: 'URL of the central backend', required: true, value: formData.centralBackendURL || '', onChange: (e) => {
4760
+ React.createElement(RowOfFields, null,
4761
+ React.createElement(CardTitle, null, "UI")),
4762
+ React.createElement(Input, { title: 'Central Backend URL', tooltip: 'When running the Centralized UI, you need to specify the URL of the central backend. <a href="https://docs.odigos.io/features/central">Learn more</a>.', required: true, value: formData.centralBackendURL || '', onChange: (e) => {
4762
4763
  const { value } = e.target;
4763
4764
  handleFormChange('centralBackendURL', value || null);
4764
4765
  } }),
4765
- React.createElement(Input, { title: 'OIDC Tenant URL', tooltip: 'URL of the OIDC tenant', required: true, value: formData.oidc?.tenantUrl || '', onChange: (e) => {
4766
+ React.createElement(Input, { title: 'OIDC Tenant URL', tooltip: 'If you need to restrict access to the Community UI, you can setup an OIDC provider. To do so you need to specify the URL of the OIDC tenant. <a href="https://docs.odigos.io/features/oidc">Learn more</a>.', required: true, value: formData.oidc?.tenantUrl || '', onChange: (e) => {
4766
4767
  const { value } = e.target;
4767
4768
  handleFormChange('oidc.tenantUrl', value || null);
4768
4769
  } }),
4769
- React.createElement(Input, { title: 'OIDC Client ID', tooltip: 'Client ID of the OIDC application', required: true, value: formData.oidc?.clientId || '', onChange: (e) => {
4770
+ React.createElement(Input, { title: 'OIDC Client ID', tooltip: 'If you need to restrict access to the Community UI, you can setup an OIDC provider. To do so you need to specify the Client ID of the OIDC application. <a href="https://docs.odigos.io/features/oidc">Learn more</a>.', required: true, value: formData.oidc?.clientId || '', onChange: (e) => {
4770
4771
  const { value } = e.target;
4771
4772
  handleFormChange('oidc.clientId', value || null);
4772
4773
  } }),
4773
- React.createElement(Input, { title: 'OIDC Client Secret', tooltip: 'Client Secret of the OIDC application', type: 'password', required: true, value: formData.oidc?.clientSecret || '', onChange: (e) => {
4774
+ React.createElement(Input, { title: 'OIDC Client Secret', tooltip: 'If you need to restrict access to the Community UI, you can setup an OIDC provider. To do so you need to specify the Client Secret of the OIDC application. <a href="https://docs.odigos.io/features/oidc">Learn more</a>.', type: 'password', required: true, value: formData.oidc?.clientSecret || '', onChange: (e) => {
4774
4775
  const { value } = e.target;
4775
4776
  handleFormChange('oidc.clientSecret', value || null);
4776
- } })));
4777
+ } }),
4778
+ isAdvanced && (React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) UI Pagination Limit', tooltip: 'The pagination limit for fetching data from the UI backend. A larger limit means more data will be fetched at once, reducing the number of requests to the backend. This might increase or decrease the performance of the UI - depending on your environment.', type: 'number', required: true, value: formData.uiPaginationLimit?.toString() || '', onChange: (e) => {
4779
+ const { value } = e.target;
4780
+ handleFormChange('uiPaginationLimit', value === '' ? null : Number(value));
4781
+ } }))));
4777
4782
  });
4778
4783
  UiSettings.displayName = UiSettings.name;
4779
4784
 
4780
- const GeneralSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4785
+ const MOUNT_METHOD_OPTIONS = [
4786
+ { id: MountMethod.VirtualDevice, value: 'Virtual Device' },
4787
+ { id: MountMethod.HostPath, value: 'Host Path' },
4788
+ { id: MountMethod.InitContainer, value: 'Init Container' },
4789
+ ];
4790
+ const AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS = [
4791
+ { id: AgentEnvVarsInjectionMethod.Loader, value: 'Loader' },
4792
+ { id: AgentEnvVarsInjectionMethod.PodManifest, value: 'Pod Manifest' },
4793
+ { id: AgentEnvVarsInjectionMethod.LoaderFallbackToPodManifest, value: 'Loader Fallback to Pod Manifest' },
4794
+ ];
4795
+ const PROFILE_OPTIONS = [
4796
+ // { id: Profile.CategoryAttributes, value: 'Category Attributes' },
4797
+ { id: Profile.CodeAttributes, value: 'Code Attributes' },
4798
+ // { id: Profile.CopyScope, value: 'Copy Scope' },
4799
+ // { id: Profile.HostnameAsPodname, value: 'Hostname as Podname' },
4800
+ { id: Profile.FullPayloadCollection, value: 'Full Payload Collection' },
4801
+ { id: Profile.DbPayloadCollection, value: 'DB Payload Collection' },
4802
+ { id: Profile.QueryOperationDetector, value: 'Query Operation Detector' },
4803
+ // { id: Profile.Semconv, value: 'Semconv' },
4804
+ // { id: Profile.ReduceSpanNameCardinality, value: 'Reduce Span Name Cardinality' },
4805
+ { id: Profile.AllowConcurrentAgents, value: 'Allow Concurrent Agents' },
4806
+ { id: Profile.JavaEbpfInstrumentations, value: 'Java EBPF Instrumentations' },
4807
+ { id: Profile.JavaNativeInstrumentations, value: 'Java Native Instrumentations' },
4808
+ // { id: Profile.LegacyDotnetInstrumentation, value: 'Legacy .NET Instrumentation' },
4809
+ // { id: Profile.MountMethodK8sHostPath, value: 'Mount Method K8s Host Path' },
4810
+ // { id: Profile.MountMethodK8sVirtualDevice, value: 'Mount Method K8s Virtual Device' },
4811
+ // { id: Profile.PodManifestEnvVarInjection, value: 'Pod Manifest Env Var Injection' },
4812
+ // { id: Profile.DisableGin, value: 'Disable Gin' },
4813
+ // { id: Profile.SmallBatches, value: 'Small Batches' },
4814
+ { id: Profile.SizeS, value: 'Size S' },
4815
+ { id: Profile.SizeM, value: 'Size M' },
4816
+ { id: Profile.SizeL, value: 'Size L' },
4817
+ ];
4818
+
4819
+ const GeneralSettings = forwardRef(({ isAdvanced, formData, handleFormChange }, ref) => {
4781
4820
  return (React.createElement(Card, { ref: ref, id: SettingsTabs.General },
4782
- React.createElement(CardTitle, null, "General"),
4783
- React.createElement(Toggle, { title: 'Karpenter Enabled', tooltip: 'Enable Karpenter support', initialValue: formData.karpenterEnabled || false, onChange: (bool) => handleFormChange('karpenterEnabled', bool) }),
4784
- React.createElement(Toggle, { title: 'Allow Concurrent Agents', tooltip: 'Allow concurrent running agents', initialValue: formData.allowConcurrentAgents || false, onChange: (bool) => handleFormChange('allowConcurrentAgents', bool) }),
4785
- React.createElement(Toggle, { title: 'Automatic Rollout Disabled', tooltip: 'Disable automatic rollout of pods after instrumentation', initialValue: formData.rollout?.automaticRolloutDisabled || false, onChange: (bool) => handleFormChange('rollout.automaticRolloutDisabled', bool) }),
4786
- React.createElement(Input, { title: 'Cluster Name', tooltip: 'Name of the cluster', required: true, value: formData.clusterName || '', onChange: (e) => {
4821
+ React.createElement(RowOfFields, null,
4822
+ React.createElement(CardTitle, null, "General")),
4823
+ React.createElement(Input, { title: 'Cluster Name', tooltip: 'Name of the cluster, this is optional, but required in the Centralized UI. <a href="https://docs.odigos.io/features/central">Learn more</a>.', required: true, value: formData.clusterName || '', onChange: (e) => {
4787
4824
  const { value } = e.target;
4788
4825
  handleFormChange('clusterName', value || null);
4789
4826
  } }),
4790
- React.createElement(Input, { title: 'Image Prefix', tooltip: 'Docker image prefix for all Odigos components', disabled: true, required: true, value: formData.imagePrefix || '', onChange: (e) => {
4827
+ React.createElement(Toggle, { title: 'Enable the Karpenter Integration', tooltip: '<a href="https://docs.odigos.io/setup/odigos-with-karpenter">Learn how to configure Karpenter</a>. Once the Karpenter tainting setup is complete, inform Odigos to disable node affinity and rely on the taint mechanism.', initialValue: formData.karpenterEnabled || false, onChange: (bool) => handleFormChange('karpenterEnabled', bool) }),
4828
+ React.createElement(Toggle, { title: 'Allow Odigos Alongisde Other Agents', tooltip: 'By default Odigos does not instrument applications that are already instrumented by other agents. If you want to allow Odigos to instrument applications that are already instrumented by other agents, enable this option. Note: this is not recommended and should be used only if you know what you are doing.', initialValue: formData.allowConcurrentAgents || false, onChange: (bool) => handleFormChange('allowConcurrentAgents', bool) }),
4829
+ React.createElement(Toggle, { title: 'Disable Automatic Rollout', tooltip: 'By default, Odigos automatically rolls out the pods after the instrumentation is complete. If you want to disable rollouts and do it manually, toggle this option.', initialValue: formData.rollout?.automaticRolloutDisabled || false, onChange: (bool) => handleFormChange('rollout.automaticRolloutDisabled', bool) }),
4830
+ React.createElement(Input, { title: 'Image Prefix', tooltip: 'Docker image prefix for all Odigos components. This is disabled because this setting requires a CLI update.', disabled: true, required: true, value: formData.imagePrefix || '', onChange: (e) => {
4791
4831
  const { value } = e.target;
4792
4832
  handleFormChange('imagePrefix', value || null);
4793
4833
  } }),
4794
4834
  React.createElement(KeyValueInputsList, { title: 'Node Selector', tooltip: 'NodeSelector is a map of key-value Kubernetes NodeSelector labels to apply to all Odigos components. Note that Odigos will only be able to instrument applications on the same node. This setting can be applied only via the CLI.', disabled: true, required: true, value: Object.entries(formData.nodeSelector || {}).map(([key, value]) => ({ key, value })) }),
4835
+ React.createElement(Dropdown, { title: 'Profiles', tooltip: 'Enable custom profiles to customize the Odigos instrumentation.', isMulti: true, options: PROFILE_OPTIONS, value: PROFILE_OPTIONS.filter((option) => formData.profiles?.includes(option.id)), onSelect: (option) => handleFormChange('profiles', [...(formData.profiles || []), option.id]), onDeselect: (option) => handleFormChange('profiles', formData.profiles?.filter((p) => p !== option.id) || []) }),
4795
4836
  React.createElement(RowOfFields, null,
4796
- React.createElement(InputList, { title: 'Ignored Namespaces', tooltip: 'List of namespaces to exclude from instrumentation', required: true, value: formData.ignoredNamespaces || [], onChange: (arr) => handleFormChange('ignoredNamespaces', arr) }),
4797
- React.createElement(InputList, { title: 'Ignored Containers', tooltip: 'List of container names to exclude from instrumentation, this is a global setting and will be applied to all applications', required: true, value: formData.ignoredContainers || [], onChange: (arr) => handleFormChange('ignoredContainers', arr) }))));
4837
+ React.createElement(InputList, { title: 'Ignored Namespaces', tooltip: 'List of namespaces to exclude from instrumentation. Note: you cannot remove the default namespaces from the list, but you are able to add more namespaces.', required: true, value: formData.ignoredNamespaces || [], onChange: (arr) => handleFormChange('ignoredNamespaces', arr) }),
4838
+ React.createElement(InputList, { title: 'Ignored Containers', tooltip: 'List of container names to exclude from instrumentation, this is a global setting and will be applied to all applications', required: true, value: formData.ignoredContainers || [], onChange: (arr) => handleFormChange('ignoredContainers', arr) })),
4839
+ isAdvanced && (React.createElement(React.Fragment, null,
4840
+ React.createElement(Dropdown, { status: StatusType.Warning, title: '(Advanced) Mount Method', tooltip: 'For Odigos agents to run inside instrumented pod containers, certain files must be mounted into the container. In Kubernetes, these files are mounted under `/var/odigos` directory, with subdirectories for each agent. <a href="https://docs.odigos.io/instrumentations/configuration/mount-method#agent-mount-method">Learn more</a>.', options: MOUNT_METHOD_OPTIONS, required: true, value: MOUNT_METHOD_OPTIONS.find((option) => option.id === formData.mountMethod) || undefined, onSelect: (option) => handleFormChange('mountMethod', option.id) }),
4841
+ React.createElement(Dropdown, { status: StatusType.Warning, title: '(Advanced) Agent Envs Injection Method', tooltip: 'In order for Odigos to instrument applications, it needs to inject environment variables into the application. This setting controls how Odigos injects these environment variables.', options: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS, required: true, value: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS.find((option) => option.id === formData.agentEnvVarsInjectionMethod) || undefined, onSelect: (option) => handleFormChange('agentEnvVarsInjectionMethod', option.id) }),
4842
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Odiglet Health Probe Port', tooltip: 'If the Odiglet is running with a host network, it may conflict with the port of other processes. This setting allows you to specify a different port for the health probe.', type: 'number', required: true, value: formData.odigletHealthProbeBindPort?.toString() || '', onChange: (e) => {
4843
+ const { value } = e.target;
4844
+ handleFormChange('odigletHealthProbeBindPort', value === '' ? null : Number(value));
4845
+ } }),
4846
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Custom Container Runtime Socket Path', tooltip: 'If containerd is located in a different path than the default supported path by Odigos, then you can specify the socket path here.', required: true, value: formData.customContainerRuntimeSocketPath || '', onChange: (e) => {
4847
+ const { value } = e.target;
4848
+ handleFormChange('customContainerRuntimeSocketPath', value || null);
4849
+ } })))));
4798
4850
  });
4799
4851
  GeneralSettings.displayName = GeneralSettings.name;
4800
4852
 
@@ -4803,136 +4855,109 @@ const RollbackSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4803
4855
  React.createElement(CardTitle, null, "Rollback"),
4804
4856
  React.createElement(Toggle, { title: 'Rollback Disabled', tooltip: 'Disable rollback', initialValue: formData.rollbackDisabled || false, onChange: (bool) => handleFormChange('rollbackDisabled', bool) }),
4805
4857
  React.createElement(RowOfFields, null,
4806
- React.createElement(Input, { title: 'Rollback Grace Time', tooltip: 'Grace time for rollback', required: true, value: formData.rollbackGraceTime || '', onChange: (e) => {
4858
+ React.createElement(Input, { title: 'Rollback Grace Time', tooltip: 'This is the amount of time that a pod should be in the `CrashLoopBackoff` state before it is rolled back. Pods that are in the `CrashLoopBackoff` state for longer than this time will be rolled back.', required: true, value: formData.rollbackGraceTime || '', onChange: (e) => {
4807
4859
  const { value } = e.target;
4808
4860
  handleFormChange('rollbackGraceTime', value || null);
4809
4861
  } }),
4810
- React.createElement(Input, { title: 'Rollback Stability Window', tooltip: 'Stability window for rollback', required: true, value: formData.rollbackStabilityWindow || '', onChange: (e) => {
4862
+ React.createElement(Input, { title: 'Rollback Stability Window', tooltip: 'This is the time-window in which the pod should be in the `CrashLoopBackoff` state before it is rolled back. Pods that are in the `CrashLoopBackoff` state after this window will not be rolled back.', required: true, value: formData.rollbackStabilityWindow || '', onChange: (e) => {
4811
4863
  const { value } = e.target;
4812
4864
  handleFormChange('rollbackStabilityWindow', value || null);
4813
4865
  } }))));
4814
4866
  });
4815
4867
  RollbackSettings.displayName = RollbackSettings.name;
4816
4868
 
4817
- const MOUNT_METHOD_OPTIONS = [
4818
- { id: MountMethod.VirtualDevice, value: 'Virtual Device' },
4819
- { id: MountMethod.HostPath, value: 'Host Path' },
4820
- { id: MountMethod.InitContainer, value: 'Init Container' },
4821
- ];
4822
- const AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS = [
4823
- { id: AgentEnvVarsInjectionMethod.Loader, value: 'Loader' },
4824
- { id: AgentEnvVarsInjectionMethod.PodManifest, value: 'Pod Manifest' },
4825
- { id: AgentEnvVarsInjectionMethod.LoaderFallbackToPodManifest, value: 'Loader Fallback to Pod Manifest' },
4826
- ];
4827
-
4828
- const AdvancedSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4829
- return (React.createElement(Card, { ref: ref, id: SettingsTabs.Advanced },
4830
- React.createElement(CardTitle, null, "Advanced"),
4831
- React.createElement(Input, { title: 'UI Pagination Limit', tooltip: 'Pagination limit for fetching data from the UI backend, bigger limit means more data will be fetched at once, and less requests will be made to the backend', type: 'number', required: true, value: formData.uiPaginationLimit?.toString() || '', onChange: (e) => {
4832
- const { value } = e.target;
4833
- handleFormChange('uiPaginationLimit', value === '' ? null : Number(value));
4834
- } }),
4835
- React.createElement(Dropdown, { title: 'Mount Method', tooltip: 'Method used to mount volume', options: MOUNT_METHOD_OPTIONS, required: true, value: MOUNT_METHOD_OPTIONS.find((option) => option.id === formData.mountMethod) || undefined, onSelect: (option) => handleFormChange('mountMethod', option.id) }),
4836
- React.createElement(Dropdown, { title: 'Agent Env Vars Injection Method', tooltip: 'How to inject env vars into agents', options: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS, required: true, value: AGENT_ENV_VARS_INJECTION_METHOD_OPTIONS.find((option) => option.id === formData.agentEnvVarsInjectionMethod) || undefined, onSelect: (option) => handleFormChange('agentEnvVarsInjectionMethod', option.id) }),
4837
- React.createElement(Input, { title: 'Odiglet Health Probe Bind Port', tooltip: 'Port to bind the health probe', type: 'number', required: true, value: formData.odigletHealthProbeBindPort?.toString() || '', onChange: (e) => {
4838
- const { value } = e.target;
4839
- handleFormChange('odigletHealthProbeBindPort', value === '' ? null : Number(value));
4840
- } }),
4841
- React.createElement(Input, { title: 'Custom Container Runtime Socket Path', tooltip: 'Path to the custom container runtime socket', required: true, value: formData.customContainerRuntimeSocketPath || '', onChange: (e) => {
4842
- const { value } = e.target;
4843
- handleFormChange('customContainerRuntimeSocketPath', value || null);
4844
- } }),
4845
- React.createElement(Input, { title: 'K8s Node Logs Directory', tooltip: 'Target directory for K8s logs if `/var/log` is a symlink', required: true, value: formData.collectorNode?.k8sNodeLogsDirectory || '', onChange: (e) => {
4846
- const { value } = e.target;
4847
- handleFormChange('collectorNode.k8sNodeLogsDirectory', value || null);
4848
- } }),
4849
- React.createElement(Input, { title: 'Coll. Node Own Metrics Port', tooltip: "Port for the collector node's own Prometheus metrics", type: 'number', required: true, value: formData.collectorNode?.collectorOwnMetricsPort?.toString() || '', onChange: (e) => {
4850
- const { value } = e.target;
4851
- handleFormChange('collectorNode.collectorOwnMetricsPort', value === '' ? null : Number(value));
4852
- } }),
4869
+ const CollectorNodeSettings = forwardRef(({ isAdvanced, formData, handleFormChange }, ref) => {
4870
+ return (React.createElement(Card, { ref: ref, id: SettingsTabs.CollectorNode },
4871
+ React.createElement(RowOfFields, null,
4872
+ React.createElement(CardTitle, null, "Collector Node")),
4853
4873
  React.createElement(RowOfFields, null,
4854
- React.createElement(Input, { title: 'Coll. Node Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4874
+ React.createElement(Input, { title: 'Request Memory', tooltip: 'You can optionally specify how much memory the collector node should request (in megabytes).', type: 'number', required: true, value: formData.collectorNode?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4855
4875
  const { value } = e.target;
4856
- handleFormChange('collectorNode.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4876
+ handleFormChange('collectorNode.requestMemoryMiB', value === '' ? null : Number(value));
4857
4877
  } }),
4858
- React.createElement(Input, { title: 'Coll. Node Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4878
+ React.createElement(Input, { title: 'Limit Memory', tooltip: 'You can optionally specify how much memory the collector node should limit (in megabytes).', type: 'number', required: true, value: formData.collectorNode?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4859
4879
  const { value } = e.target;
4860
- handleFormChange('collectorNode.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4880
+ handleFormChange('collectorNode.limitMemoryMiB', value === '' ? null : Number(value));
4861
4881
  } })),
4862
- React.createElement(Input, { title: 'Coll. Node Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4863
- const { value } = e.target;
4864
- handleFormChange('collectorNode.goMemLimitMiB', value === '' ? null : Number(value));
4865
- } }),
4866
4882
  React.createElement(RowOfFields, null,
4867
- React.createElement(Input, { title: 'Coll. Gateway Memory Limiter Limit (MB)', tooltip: 'Memory limiter limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4883
+ React.createElement(Input, { title: 'Request CPU', tooltip: 'You can optionally specify how much CPU the collector node should request (in millicores).', type: 'number', required: true, value: formData.collectorNode?.requestCPUm?.toString() || '', onChange: (e) => {
4868
4884
  const { value } = e.target;
4869
- handleFormChange('collectorGateway.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4885
+ handleFormChange('collectorNode.requestCPUm', value === '' ? null : Number(value));
4870
4886
  } }),
4871
- React.createElement(Input, { title: 'Coll. Gateway Memory Limiter Spike Limit (MB)', tooltip: 'Memory limiter spike limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4887
+ React.createElement(Input, { title: 'Limit CPU', tooltip: 'You can optionally specify how much CPU the collector node should limit (in millicores).', type: 'number', required: true, value: formData.collectorNode?.limitCPUm?.toString() || '', onChange: (e) => {
4872
4888
  const { value } = e.target;
4873
- handleFormChange('collectorGateway.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4889
+ handleFormChange('collectorNode.limitCPUm', value === '' ? null : Number(value));
4874
4890
  } })),
4875
- React.createElement(Input, { title: 'Coll. Gateway Go Memory Limit (MB)', tooltip: 'Go memory limit for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4876
- const { value } = e.target;
4877
- handleFormChange('collectorGateway.goMemLimitMiB', value === '' ? null : Number(value));
4878
- } })));
4879
- });
4880
- AdvancedSettings.displayName = AdvancedSettings.name;
4881
-
4882
- const CollectorNodeSettings = forwardRef(({ formData, handleFormChange }, ref) => {
4883
- return (React.createElement(Card, { ref: ref, id: SettingsTabs.CollectorNode },
4884
- React.createElement(CardTitle, null, "Collector Node"),
4885
- React.createElement(RowOfFields, null,
4886
- React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4891
+ isAdvanced && (React.createElement(React.Fragment, null,
4892
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) K8s Node Logs Directory', tooltip: 'If `/var/log` is a symlink, you can specify the target directory for Kubernetes logs here.', required: true, value: formData.collectorNode?.k8sNodeLogsDirectory || '', onChange: (e) => {
4887
4893
  const { value } = e.target;
4888
- handleFormChange('collectorNode.requestMemoryMiB', value === '' ? null : Number(value));
4894
+ handleFormChange('collectorNode.k8sNodeLogsDirectory', value || null);
4889
4895
  } }),
4890
- React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector node in Megabytes', type: 'number', required: true, value: formData.collectorNode?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4896
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Own Metrics Port', tooltip: 'If the collector node is running with a host network, it may conflict with the port of other processes. This setting allows you to specify a different port for the own metrics.', type: 'number', required: true, value: formData.collectorNode?.collectorOwnMetricsPort?.toString() || '', onChange: (e) => {
4891
4897
  const { value } = e.target;
4892
- handleFormChange('collectorNode.limitMemoryMiB', value === '' ? null : Number(value));
4893
- } })),
4894
- React.createElement(RowOfFields, null,
4895
- React.createElement(Input, { title: 'Request CPU (m)', tooltip: 'Request CPU for the collector node in Millicores', type: 'number', required: true, value: formData.collectorNode?.requestCPUm?.toString() || '', onChange: (e) => {
4896
- const { value } = e.target;
4897
- handleFormChange('collectorNode.requestCPUm', value === '' ? null : Number(value));
4898
+ handleFormChange('collectorNode.collectorOwnMetricsPort', value === '' ? null : Number(value));
4898
4899
  } }),
4899
- React.createElement(Input, { title: 'Limit CPU (m)', tooltip: 'Limit CPU for the collector node in Millicores', type: 'number', required: true, value: formData.collectorNode?.limitCPUm?.toString() || '', onChange: (e) => {
4900
+ React.createElement(RowOfFields, null,
4901
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Memory Limiter Limit', tooltip: 'You can optionally specify how much memory the collector node should limit (in megabytes).', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4902
+ const { value } = e.target;
4903
+ handleFormChange('collectorNode.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4904
+ } }),
4905
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Memory Limiter Spike Limit', tooltip: 'You can optionally specify how much memory the collector node should limit (in megabytes).', type: 'number', required: true, value: formData.collectorNode?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4906
+ const { value } = e.target;
4907
+ handleFormChange('collectorNode.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4908
+ } })),
4909
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Go Memory Limit', tooltip: 'Sets the GOMEMLIMIT environment variable to control Go runtime memory usage. This soft memory limit helps the garbage collector prevent out-of-memory conditions in Kubernetes by triggering more aggressive garbage collection as memory usage approaches the limit (in megabytes).', type: 'number', required: true, value: formData.collectorNode?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4900
4910
  const { value } = e.target;
4901
- handleFormChange('collectorNode.limitCPUm', value === '' ? null : Number(value));
4902
- } }))));
4911
+ handleFormChange('collectorNode.goMemLimitMiB', value === '' ? null : Number(value));
4912
+ } })))));
4903
4913
  });
4904
4914
  CollectorNodeSettings.displayName = CollectorNodeSettings.name;
4905
4915
 
4906
- const CollectorGatewaySettings = forwardRef(({ formData, handleFormChange }, ref) => {
4916
+ const CollectorGatewaySettings = forwardRef(({ isAdvanced, formData, handleFormChange }, ref) => {
4907
4917
  return (React.createElement(Card, { ref: ref, id: SettingsTabs.CollectorGateway },
4908
- React.createElement(CardTitle, null, "Collector Gateway"),
4909
4918
  React.createElement(RowOfFields, null,
4910
- React.createElement(Input, { title: 'Autoscaler Min. Replicas', tooltip: 'Minimum number of replicas for the collector gateway', type: 'number', required: true, value: formData.collectorGateway?.minReplicas?.toString() || '', onChange: (e) => {
4919
+ React.createElement(CardTitle, null, "Collector Gateway")),
4920
+ React.createElement(RowOfFields, null,
4921
+ React.createElement(Input, { title: 'Autoscaler Min. Replicas', tooltip: 'You can optionally specify the minimum number of replicas for the collector gateway.', type: 'number', required: true, value: formData.collectorGateway?.minReplicas?.toString() || '', onChange: (e) => {
4911
4922
  const { value } = e.target;
4912
4923
  handleFormChange('collectorGateway.minReplicas', value === '' ? null : Number(value));
4913
4924
  } }),
4914
- React.createElement(Input, { title: 'Autoscaler Max. Replicas', tooltip: 'Maximum number of replicas for the collector gateway', type: 'number', required: true, value: formData.collectorGateway?.maxReplicas?.toString() || '', onChange: (e) => {
4925
+ React.createElement(Input, { title: 'Autoscaler Max. Replicas', tooltip: 'You can optionally specify the maximum number of replicas for the collector gateway.', type: 'number', required: true, value: formData.collectorGateway?.maxReplicas?.toString() || '', onChange: (e) => {
4915
4926
  const { value } = e.target;
4916
4927
  handleFormChange('collectorGateway.maxReplicas', value === '' ? null : Number(value));
4917
4928
  } })),
4918
4929
  React.createElement(RowOfFields, null,
4919
- React.createElement(Input, { title: 'Request Memory (MB)', tooltip: 'Request memory for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4930
+ React.createElement(Input, { title: 'Request Memory', tooltip: 'You can optionally specify how much memory the collector gateway should request (in megabytes).', type: 'number', required: true, value: formData.collectorGateway?.requestMemoryMiB?.toString() || '', onChange: (e) => {
4920
4931
  const { value } = e.target;
4921
4932
  handleFormChange('collectorGateway.requestMemoryMiB', value === '' ? null : Number(value));
4922
4933
  } }),
4923
- React.createElement(Input, { title: 'Limit Memory (MB)', tooltip: 'Limit memory for the collector gateway in Megabytes', type: 'number', required: true, value: formData.collectorGateway?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4934
+ React.createElement(Input, { title: 'Limit Memory', tooltip: 'You can optionally specify how much memory the collector gateway should limit (in megabytes).', type: 'number', required: true, value: formData.collectorGateway?.limitMemoryMiB?.toString() || '', onChange: (e) => {
4924
4935
  const { value } = e.target;
4925
4936
  handleFormChange('collectorGateway.limitMemoryMiB', value === '' ? null : Number(value));
4926
4937
  } })),
4927
4938
  React.createElement(RowOfFields, null,
4928
- React.createElement(Input, { title: 'Request CPU (m)', tooltip: 'Request CPU for the collector gateway in Millicores', type: 'number', required: true, value: formData.collectorGateway?.requestCPUm?.toString() || '', onChange: (e) => {
4939
+ React.createElement(Input, { title: 'Request CPU', tooltip: 'You can optionally specify how much CPU the collector gateway should request (in millicores).', type: 'number', required: true, value: formData.collectorGateway?.requestCPUm?.toString() || '', onChange: (e) => {
4929
4940
  const { value } = e.target;
4930
4941
  handleFormChange('collectorGateway.requestCPUm', value === '' ? null : Number(value));
4931
4942
  } }),
4932
- React.createElement(Input, { title: 'Limit CPU (m)', tooltip: 'Limit CPU for the collector gateway in Millicores', type: 'number', required: true, value: formData.collectorGateway?.limitCPUm?.toString() || '', onChange: (e) => {
4943
+ React.createElement(Input, { title: 'Limit CPU', tooltip: 'You can optionally specify how much CPU the collector gateway should limit (in millicores).', type: 'number', required: true, value: formData.collectorGateway?.limitCPUm?.toString() || '', onChange: (e) => {
4933
4944
  const { value } = e.target;
4934
4945
  handleFormChange('collectorGateway.limitCPUm', value === '' ? null : Number(value));
4935
- } }))));
4946
+ } })),
4947
+ isAdvanced && (React.createElement(React.Fragment, null,
4948
+ React.createElement(RowOfFields, null,
4949
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Memory Limiter Limit', tooltip: 'You can optionally specify how much memory the collector gateway should limit (in megabytes).', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterLimitMiB?.toString() || '', onChange: (e) => {
4950
+ const { value } = e.target;
4951
+ handleFormChange('collectorGateway.memoryLimiterLimitMiB', value === '' ? null : Number(value));
4952
+ } }),
4953
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Memory Limiter Spike Limit', tooltip: 'You can optionally specify how much memory the collector gateway should limit (in megabytes).', type: 'number', required: true, value: formData.collectorGateway?.memoryLimiterSpikeLimitMiB?.toString() || '', onChange: (e) => {
4954
+ const { value } = e.target;
4955
+ handleFormChange('collectorGateway.memoryLimiterSpikeLimitMiB', value === '' ? null : Number(value));
4956
+ } })),
4957
+ React.createElement(Input, { status: StatusType.Warning, title: '(Advanced) Go Memory Limit', tooltip: 'Sets the GOMEMLIMIT environment variable to control Go runtime memory usage. This soft memory limit helps the garbage collector prevent out-of-memory conditions in Kubernetes by triggering more aggressive garbage collection as memory usage approaches the limit (in megabytes).', type: 'number', required: true, value: formData.collectorGateway?.goMemLimitMiB?.toString() || '', onChange: (e) => {
4958
+ const { value } = e.target;
4959
+ handleFormChange('collectorGateway.goMemLimitMiB', value === '' ? null : Number(value));
4960
+ } })))));
4936
4961
  });
4937
4962
  CollectorGatewaySettings.displayName = CollectorGatewaySettings.name;
4938
4963
 
@@ -4943,18 +4968,26 @@ const DataContainer = styled.div `
4943
4968
  max-height: 100vh;
4944
4969
  overflow-y: auto;
4945
4970
  `;
4971
+ const Relative = styled.div `
4972
+ position: relative;
4973
+ `;
4946
4974
  const DRAWER_WIDTH = '750px';
4947
4975
  const TITLE_TEXT = 'System Settings';
4948
4976
  const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
4949
4977
  const [settings, setSettings] = useState(undefined);
4950
- const { formData, handleFormChange, resetFormData, isFormDirty } = useGenericForm(settings);
4951
- useEffect(() => {
4952
- fetchSettings().then(setSettings);
4953
- // eslint-disable-next-line react-hooks/exhaustive-deps
4954
- }, []);
4955
4978
  const [isSaving, setIsSaving] = useState(false);
4979
+ const [isAdvanced, setIsAdvanced] = useState(false);
4956
4980
  const [isOpen, setIsOpen] = useState(false);
4957
4981
  const toggleOpen = () => setIsOpen((prev) => !prev);
4982
+ const { popupRef, popupOpen, setPopupOpen } = usePopup();
4983
+ const { formData, handleFormChange, resetFormData, isFormDirty } = useGenericForm(settings);
4984
+ useEffect(() => {
4985
+ if (isOpen)
4986
+ fetchSettings().then(setSettings);
4987
+ else
4988
+ setSettings(undefined);
4989
+ // eslint-disable-next-line react-hooks/exhaustive-deps
4990
+ }, [isOpen]);
4958
4991
  const [cancelWarningOpen, setCancelWarningOpen] = useState(false);
4959
4992
  const [cancelApproveCallback, setCancelApproveCallback] = useState(null);
4960
4993
  const handleWithCancelWarning = (callback) => {
@@ -4980,9 +5013,8 @@ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
4980
5013
  const rollbackRef = useRef(null);
4981
5014
  const collectorNodeRef = useRef(null);
4982
5015
  const collectorGatewayRef = useRef(null);
4983
- const advancedRef = useRef(null);
4984
- const refsArray = [generalRef, uiRef, rollbackRef, collectorNodeRef, collectorGatewayRef, advancedRef];
4985
- const tabsArray = [SettingsTabs.General, SettingsTabs.Ui, SettingsTabs.Rollback, SettingsTabs.CollectorNode, SettingsTabs.CollectorGateway, SettingsTabs.Advanced];
5016
+ const refsArray = [generalRef, uiRef, rollbackRef, collectorNodeRef, collectorGatewayRef];
5017
+ const tabsArray = [SettingsTabs.General, SettingsTabs.Ui, SettingsTabs.Rollback, SettingsTabs.CollectorNode, SettingsTabs.CollectorGateway];
4986
5018
  const scrollTo = (id) => {
4987
5019
  const scrollContainer = scrollContainerRef.current;
4988
5020
  if (!scrollContainer)
@@ -4993,7 +5025,7 @@ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
4993
5025
  if (curr && curr.id === id) {
4994
5026
  const containerRect = scrollContainer.getBoundingClientRect();
4995
5027
  const targetRect = curr.getBoundingClientRect();
4996
- relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop - 20; // -20px offset for better visual spacing
5028
+ relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop;
4997
5029
  break;
4998
5030
  }
4999
5031
  }
@@ -5002,22 +5034,21 @@ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
5002
5034
  behavior: 'smooth',
5003
5035
  });
5004
5036
  };
5005
- const onScroll = (e) => {
5006
- const scrollContainer = scrollContainerRef.current;
5007
- if (!scrollContainer)
5008
- return;
5009
- const scrollTop = e.currentTarget.scrollTop;
5010
- for (let i = 0; i < refsArray.length; i++) {
5011
- const curr = refsArray[i].current;
5012
- if (curr) {
5013
- const containerRect = scrollContainer.getBoundingClientRect();
5014
- const targetRect = curr.getBoundingClientRect();
5015
- const relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop;
5016
- if (relativeTop <= scrollTop)
5017
- setSelectedTab(tabsArray[i]);
5018
- }
5019
- }
5020
- };
5037
+ // Note: this is commented out because the different sections are too small (they don't cover the entire drawer height), due to this the "selected tab" logic is not working as expected
5038
+ // const onScroll = (e: React.UIEvent<HTMLDivElement>) => {
5039
+ // const scrollContainer = scrollContainerRef.current;
5040
+ // if (!scrollContainer) return;
5041
+ // const scrollTop = e.currentTarget.scrollTop;
5042
+ // for (let i = 0; i < refsArray.length; i++) {
5043
+ // const curr = refsArray[i].current;
5044
+ // if (curr) {
5045
+ // const containerRect = scrollContainer.getBoundingClientRect();
5046
+ // const targetRect = curr.getBoundingClientRect();
5047
+ // const relativeTop = targetRect.top - containerRect.top + scrollContainer.scrollTop;
5048
+ // if (relativeTop <= scrollTop) setSelectedTab(tabsArray[i]);
5049
+ // }
5050
+ // }
5051
+ // };
5021
5052
  const handleTabChange = (tab) => {
5022
5053
  setSelectedTab(tab);
5023
5054
  scrollTo(tab);
@@ -5028,37 +5059,17 @@ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
5028
5059
  React.createElement(Drawer, { width: DRAWER_WIDTH, isOpen: isOpen, onClose: () => handleWithCancelWarning(toggleOpen), header: {
5029
5060
  icons: [GearIcon],
5030
5061
  title: TITLE_TEXT,
5031
- tabs: [
5032
- {
5033
- label: SettingsTabs.General,
5034
- onClick: () => handleTabChange(SettingsTabs.General),
5035
- selected: selectedTab === SettingsTabs.General,
5036
- },
5037
- {
5038
- label: SettingsTabs.Ui,
5039
- onClick: () => handleTabChange(SettingsTabs.Ui),
5040
- selected: selectedTab === SettingsTabs.Ui,
5041
- },
5042
- {
5043
- label: SettingsTabs.Rollback,
5044
- onClick: () => handleTabChange(SettingsTabs.Rollback),
5045
- selected: selectedTab === SettingsTabs.Rollback,
5046
- },
5047
- {
5048
- label: SettingsTabs.CollectorNode,
5049
- onClick: () => handleTabChange(SettingsTabs.CollectorNode),
5050
- selected: selectedTab === SettingsTabs.CollectorNode,
5051
- },
5052
- {
5053
- label: SettingsTabs.CollectorGateway,
5054
- onClick: () => handleTabChange(SettingsTabs.CollectorGateway),
5055
- selected: selectedTab === SettingsTabs.CollectorGateway,
5056
- },
5057
- {
5058
- label: SettingsTabs.Advanced,
5059
- onClick: () => handleTabChange(SettingsTabs.Advanced),
5060
- selected: selectedTab === SettingsTabs.Advanced,
5061
- },
5062
+ tabs: tabsArray.map((tab) => ({
5063
+ label: tab,
5064
+ onClick: () => handleTabChange(tab),
5065
+ selected: selectedTab === tab,
5066
+ })),
5067
+ actions: [
5068
+ React.createElement(Relative, { key: 'actions' },
5069
+ React.createElement(IconButton, { withBorder: true, onClick: () => setPopupOpen((prev) => !prev) },
5070
+ React.createElement(Text, { size: 10 }, "\u2022\u2022\u2022")),
5071
+ React.createElement(Popup, { ref: popupRef, isOpen: popupOpen, top: 36, right: 0, padding: '24px', width: '270px' },
5072
+ React.createElement(Toggle, { title: 'Enable Advanced Mode', tooltip: 'Show advanced settings. Note: these are not recommended to be changed unless you know what you are doing.', initialValue: isAdvanced, onChange: () => setIsAdvanced((prev) => !prev), flipHorizontally: true }))),
5062
5073
  ],
5063
5074
  }, footer: {
5064
5075
  isOpen: isFormDirty,
@@ -5076,14 +5087,13 @@ const SystemSettings = ({ installationMethod, fetchSettings, onSave }) => {
5076
5087
  children: BUTTON_TEXTS.SAVE,
5077
5088
  },
5078
5089
  ],
5079
- } }, formData?.imagePrefix !== undefined && !isSaving ? (React.createElement(DataContainer, { ref: scrollContainerRef, onScroll: onScroll },
5090
+ } }, formData?.imagePrefix !== undefined && !isSaving ? (React.createElement(DataContainer, { ref: scrollContainerRef },
5080
5091
  installationMethod === InstallationMethod.Helm && React.createElement(NotificationNote, { type: StatusType.Warning, title: 'Helm', message: "Changes won't persist unless you update the `values.yaml` file" }),
5081
- React.createElement(GeneralSettings, { ref: generalRef, formData: formData, handleFormChange: handleFormChange }),
5082
- React.createElement(UiSettings, { ref: uiRef, formData: formData, handleFormChange: handleFormChange }),
5083
- React.createElement(RollbackSettings, { ref: rollbackRef, formData: formData, handleFormChange: handleFormChange }),
5084
- React.createElement(CollectorNodeSettings, { ref: collectorNodeRef, formData: formData, handleFormChange: handleFormChange }),
5085
- React.createElement(CollectorGatewaySettings, { ref: collectorGatewayRef, formData: formData, handleFormChange: handleFormChange }),
5086
- React.createElement(AdvancedSettings, { ref: advancedRef, formData: formData, handleFormChange: handleFormChange }))) : (React.createElement(CenterThis, null,
5092
+ React.createElement(GeneralSettings, { ref: generalRef, isAdvanced: isAdvanced, formData: formData, handleFormChange: handleFormChange }),
5093
+ React.createElement(UiSettings, { ref: uiRef, isAdvanced: isAdvanced, formData: formData, handleFormChange: handleFormChange }),
5094
+ React.createElement(RollbackSettings, { ref: rollbackRef, isAdvanced: isAdvanced, formData: formData, handleFormChange: handleFormChange }),
5095
+ React.createElement(CollectorNodeSettings, { ref: collectorNodeRef, isAdvanced: isAdvanced, formData: formData, handleFormChange: handleFormChange }),
5096
+ React.createElement(CollectorGatewaySettings, { ref: collectorGatewayRef, isAdvanced: isAdvanced, formData: formData, handleFormChange: handleFormChange }))) : (React.createElement(CenterThis, null,
5087
5097
  React.createElement(FadeLoader, { scale: 1.2 })))),
5088
5098
  React.createElement(CancelWarning, { isOpen: cancelWarningOpen, name: TITLE_TEXT, onApprove: () => {
5089
5099
  cancelApproveCallback?.();
@@ -1,2 +1,3 @@
1
1
  import { StatusType, type SVG } from '@/types';
2
- export declare const getStatusIcon: (type: StatusType, theme: Record<"text", Record<StatusType, string>>) => SVG;
2
+ import type { DefaultTheme } from 'styled-components';
3
+ export declare const getStatusIcon: (type: StatusType, theme: DefaultTheme) => SVG;
package/lib/functions.js CHANGED
@@ -1,13 +1,13 @@
1
- export { c as capitalizeFirstLetter, f as flattenObjectKeys, g as getConditionsBooleans, a as getMonitorIcon, b as getStatusIcon, i as isStringABoolean, d as isValidVersion, m as mapConditions, n as numbersOnly, p as parseBooleanFromString, e as parseJsonStringToPrettyString, r as removeEmptyValuesFromObject, s as safeJsonStringify, h as splitCamelString } from './index-58440c5c.js';
2
- export { c as compareCondition, f as filterActions, a as filterDestinations, b as filterDestinationsByStream, d as filterSources, e as filterSourcesByStream, g as formatBytes, i as getContainersIcons, h as getContainersInstrumentedCount, j as getDestinationIcon, k as getEntityIcon, l as getEntityLabel, m as getMetricForEntity, n as getPlatformIcon, o as getPlatformLabel, p as getValueForRange, q as getWorkloadId, r as getYamlFieldsForDestination, s as hasUnhealthyInstances, t as isOverTime, u as mapDestinationFieldsForDisplay, v as sleep } from './index-42f40e7c.js';
1
+ export { c as capitalizeFirstLetter, f as flattenObjectKeys, g as getConditionsBooleans, a as getMonitorIcon, b as getStatusIcon, i as isStringABoolean, d as isValidVersion, m as mapConditions, n as numbersOnly, p as parseBooleanFromString, e as parseJsonStringToPrettyString, r as removeEmptyValuesFromObject, s as safeJsonStringify, h as splitCamelString } from './index-281d9862.js';
2
+ export { c as compareCondition, f as filterActions, a as filterDestinations, b as filterDestinationsByStream, d as filterSources, e as filterSourcesByStream, g as formatBytes, i as getContainersIcons, h as getContainersInstrumentedCount, j as getDestinationIcon, k as getEntityIcon, l as getEntityLabel, m as getMetricForEntity, n as getPlatformIcon, o as getPlatformLabel, p as getValueForRange, q as getWorkloadId, r as getYamlFieldsForDestination, s as hasUnhealthyInstances, t as isOverTime, u as mapDestinationFieldsForDisplay, v as sleep } from './index-ed649685.js';
3
3
  export { d as deepClone, i as isEmpty, s as safeJsonParse } from './index-5e5f7bda.js';
4
- export { g as getActionIcon, c as getEntityId, d as getInstrumentationRuleIcon, e as getProgrammingLanguageIcon } from './index-bd48e6e2.js';
4
+ export { g as getActionIcon, c as getEntityId, d as getInstrumentationRuleIcon, e as getProgrammingLanguageIcon } from './index-8fc2f11e.js';
5
5
  export { g as getIdFromSseTarget, i as isLegalK8sLabel, m as mapExportedSignals } from './index-6a6bea6e.js';
6
6
  import { ProgrammingLanguages, EntityTypes } from './types.js';
7
7
  import 'react';
8
8
  import 'styled-components';
9
- import './index-50101bec.js';
10
- import './index-acc7c7dd.js';
9
+ import './index-89b23a82.js';
10
+ import './index-5102bee6.js';
11
11
 
12
12
  const cleanObjectEmptyStringsValues = (obj) => {
13
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any