@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.
- package/CHANGELOG.md +19 -0
- package/lib/components/dropdown/index.d.ts +2 -1
- package/lib/components/field-label/index.d.ts +2 -0
- package/lib/components/input/index.d.ts +2 -1
- package/lib/components/popup/index.d.ts +3 -2
- package/lib/components/text/index.d.ts +1 -1
- package/lib/components.js +8 -8
- package/lib/constants.js +1 -1
- package/lib/containers/system-settings/settings/options.d.ts +2 -1
- package/lib/containers/system-settings/settings/types.d.ts +2 -2
- package/lib/containers.js +185 -175
- package/lib/functions/get-status-icon/index.d.ts +2 -1
- package/lib/functions.js +5 -5
- package/lib/hooks.js +3 -3
- package/lib/icons.js +6 -6
- package/lib/{index-58440c5c.js → index-281d9862.js} +2 -2
- package/lib/{index-c1df4281.js → index-35e207a1.js} +1 -1
- package/lib/{index-acc7c7dd.js → index-5102bee6.js} +1 -1
- package/lib/{index-f2da9ad4.js → index-728cf83d.js} +80 -34
- package/lib/{index-50101bec.js → index-89b23a82.js} +1 -1
- package/lib/{index-bd48e6e2.js → index-8fc2f11e.js} +3 -3
- package/lib/{index-7074fb24.js → index-b3808507.js} +2 -2
- package/lib/{index-42f40e7c.js → index-ed649685.js} +3 -3
- package/lib/{index-391844c6.js → index-fed7fc91.js} +1 -1
- package/lib/snippets.js +7 -7
- package/lib/store.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/types/config/index.d.ts +13 -0
- package/lib/types.js +25 -1
- package/lib/{useTransition-c2aef0e4.js → useTransition-26bd4722.js} +1 -1
- package/package.json +15 -15
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
11
|
-
import { E as EditIcon, T as TrashIcon, S as SearchIcon, h as CheckIcon, P as PlusIcon, a as CopyIcon } from './index-
|
|
12
|
-
import { D as DeleteWarning, C as CancelWarning } from './index-
|
|
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-
|
|
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-
|
|
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-
|
|
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(
|
|
4761
|
-
|
|
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
|
|
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(
|
|
4783
|
-
|
|
4784
|
-
React.createElement(
|
|
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(
|
|
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: '
|
|
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: '
|
|
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
|
|
4818
|
-
{
|
|
4819
|
-
|
|
4820
|
-
|
|
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: '
|
|
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.
|
|
4876
|
+
handleFormChange('collectorNode.requestMemoryMiB', value === '' ? null : Number(value));
|
|
4857
4877
|
} }),
|
|
4858
|
-
React.createElement(Input, { title: '
|
|
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.
|
|
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: '
|
|
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('
|
|
4885
|
+
handleFormChange('collectorNode.requestCPUm', value === '' ? null : Number(value));
|
|
4870
4886
|
} }),
|
|
4871
|
-
React.createElement(Input, { title: '
|
|
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('
|
|
4889
|
+
handleFormChange('collectorNode.limitCPUm', value === '' ? null : Number(value));
|
|
4874
4890
|
} })),
|
|
4875
|
-
React.createElement(
|
|
4876
|
-
|
|
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.
|
|
4894
|
+
handleFormChange('collectorNode.k8sNodeLogsDirectory', value || null);
|
|
4889
4895
|
} }),
|
|
4890
|
-
React.createElement(Input, { title: '
|
|
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.
|
|
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(
|
|
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.
|
|
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(
|
|
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: '
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4984
|
-
const
|
|
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
|
|
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
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
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
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
{
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
10
|
-
import './index-
|
|
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
|