diff --git a/frontend/src/container/LogExplorerQuerySection/index.tsx b/frontend/src/container/LogExplorerQuerySection/index.tsx
index 1eea60da47..f807103f68 100644
--- a/frontend/src/container/LogExplorerQuerySection/index.tsx
+++ b/frontend/src/container/LogExplorerQuerySection/index.tsx
@@ -1,5 +1,6 @@
import './LogsExplorerQuerySection.styles.scss';
+import { FeatureKeys } from 'constants/features';
import {
initialQueriesMap,
OPERATORS,
@@ -9,11 +10,13 @@ import ExplorerOrderBy from 'container/ExplorerOrderBy';
import { QueryBuilder } from 'container/QueryBuilder';
import { OrderByFilterProps } from 'container/QueryBuilder/filters/OrderByFilter/OrderByFilter.interfaces';
import QueryBuilderSearch from 'container/QueryBuilder/filters/QueryBuilderSearch';
+import QueryBuilderSearchV2 from 'container/QueryBuilder/filters/QueryBuilderSearchV2/QueryBuilderSearchV2';
import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces';
import { useGetPanelTypesQueryParam } from 'hooks/queryBuilder/useGetPanelTypesQueryParam';
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
import { useQueryOperations } from 'hooks/queryBuilder/useQueryBuilderOperations';
import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl';
+import useFeatureFlags from 'hooks/useFeatureFlag';
import {
prepareQueryWithDefaultTimestamp,
SELECTED_VIEWS,
@@ -86,15 +89,26 @@ function LogExplorerQuerySection({
[handleChangeQueryData],
);
+ const isSearchV2Enabled =
+ useFeatureFlags(FeatureKeys.QUERY_BUILDER_SEARCH_V2)?.active || false;
+
return (
<>
{selectedView === SELECTED_VIEWS.SEARCH && (
-
+ {isSearchV2Enabled ? (
+
+ ) : (
+
+ )}
)}
diff --git a/frontend/src/container/LogsExplorerTable/index.tsx b/frontend/src/container/LogsExplorerTable/index.tsx
index 13883d3a62..e65bd61464 100644
--- a/frontend/src/container/LogsExplorerTable/index.tsx
+++ b/frontend/src/container/LogsExplorerTable/index.tsx
@@ -30,6 +30,7 @@ function LogsExplorerTable({
queryTableData={data}
loading={isLoading}
rootClassName="logs-table"
+ sticky
/>
);
}
diff --git a/frontend/src/container/MetricsApplication/Tabs/Overview/TopOperationMetrics.tsx b/frontend/src/container/MetricsApplication/Tabs/Overview/TopOperationMetrics.tsx
index 22224862a4..ed77512d89 100644
--- a/frontend/src/container/MetricsApplication/Tabs/Overview/TopOperationMetrics.tsx
+++ b/frontend/src/container/MetricsApplication/Tabs/Overview/TopOperationMetrics.tsx
@@ -114,6 +114,7 @@ function TopOperationMetrics(): JSX.Element {
loading={isLoading}
renderColumnCell={renderColumnCell}
downloadOption={topOperationMetricsDownloadOptions}
+ sticky
/>
);
}
diff --git a/frontend/src/container/MetricsApplication/Tabs/util.ts b/frontend/src/container/MetricsApplication/Tabs/util.ts
index 6832fe9d02..3e4dbeceb4 100644
--- a/frontend/src/container/MetricsApplication/Tabs/util.ts
+++ b/frontend/src/container/MetricsApplication/Tabs/util.ts
@@ -4,6 +4,8 @@ import ROUTES from 'constants/routes';
import { routeConfig } from 'container/SideNav/config';
import { getQueryString } from 'container/SideNav/helper';
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
+import useResourceAttribute from 'hooks/useResourceAttribute';
+import { resourceAttributesToTracesFilterItems } from 'hooks/useResourceAttribute/utils';
import history from 'lib/history';
import { traceFilterKeys } from 'pages/TracesExplorer/Filter/filterUtils';
import { Dispatch, SetStateAction, useMemo } from 'react';
@@ -142,7 +144,12 @@ export function useGetAPMToTracesQueries({
filters?: TagFilterItem[];
}): Query {
const { updateAllQueriesOperators } = useQueryBuilder();
+ const { queries } = useResourceAttribute();
+ const resourceAttributesFilters = useMemo(
+ () => resourceAttributesToTracesFilterItems(queries),
+ [queries],
+ );
const finalFilters: TagFilterItem[] = [];
let spanKindFilter: TagFilterItem;
let dbCallFilter: TagFilterItem;
@@ -185,6 +192,10 @@ export function useGetAPMToTracesQueries({
finalFilters.push(...filters);
}
+ if (resourceAttributesFilters?.length) {
+ finalFilters.push(...resourceAttributesFilters);
+ }
+
return useMemo(() => {
const updatedQuery = updateAllQueriesOperators(
initialQueriesMap.traces,
@@ -199,5 +210,5 @@ export function useGetAPMToTracesQueries({
finalFilters,
);
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [servicename, updateAllQueriesOperators]);
+ }, [servicename, queries, updateAllQueriesOperators]);
}
diff --git a/frontend/src/container/MetricsApplication/TopOperationsTable.tsx b/frontend/src/container/MetricsApplication/TopOperationsTable.tsx
index d897c8a205..da90045b6e 100644
--- a/frontend/src/container/MetricsApplication/TopOperationsTable.tsx
+++ b/frontend/src/container/MetricsApplication/TopOperationsTable.tsx
@@ -50,19 +50,21 @@ function TopOperationsTable({
const { servicename: encodedServiceName } = params;
const servicename = decodeURIComponent(encodedServiceName);
- const opFilter: TagFilterItem = {
- id: uuid().slice(0, 8),
- key: {
- key: 'name',
- dataType: DataTypes.String,
- type: 'tag',
- isColumn: true,
- isJSON: false,
- id: 'name--string--tag--true',
+ const opFilters: TagFilterItem[] = [
+ {
+ id: uuid().slice(0, 8),
+ key: {
+ key: 'name',
+ dataType: DataTypes.String,
+ type: 'tag',
+ isColumn: true,
+ isJSON: false,
+ id: 'name--string--tag--true',
+ },
+ op: 'in',
+ value: [operation],
},
- op: 'in',
- value: [operation],
- };
+ ];
const preparedQuery: Query = {
...apmToTraceQuery,
@@ -72,7 +74,7 @@ function TopOperationsTable({
...item,
filters: {
...item.filters,
- items: [...item.filters.items, opFilter],
+ items: [...item.filters.items, ...opFilters],
},
})),
},
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
index 5be4c4a528..18c5352f97 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
index 5be4c4a528..18c5352f97 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
index 5be4c4a528..18c5352f97 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
index 5be4c4a528..18c5352f97 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSEc2/md-docs/ecsEc2-createDaemonService.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSEc2/md-docs/ecsEc2-createDaemonService.md
index 83bb67039b..2c313c455a 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSEc2/md-docs/ecsEc2-createDaemonService.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSEc2/md-docs/ecsEc2-createDaemonService.md
@@ -51,7 +51,7 @@ aws ecs list-tasks --cluster ${CLUSTER_NAME} --region ${REGION}
To verify that the data is being sent to SigNoz Cloud, you can go to the dashboard section of SigNoz and import one of the following dashboards below:
- [instancemetrics.json](https://raw.githubusercontent.com/SigNoz/dashboards/chore/ecs-dashboards/ecs-infra-metrics/instance-metrics.json)
-- [hostmetrics-with-variable.json](https://raw.githubusercontent.com/SigNoz/dashboards/main/hostmetrics/hostmetrics-with-variable.json)
+- [hostmetrics.json](https://raw.githubusercontent.com/SigNoz/dashboards/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSExternal/md-docs/ecsExternal-createDaemonService.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSExternal/md-docs/ecsExternal-createDaemonService.md
index 83bb67039b..2c313c455a 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSExternal/md-docs/ecsExternal-createDaemonService.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/ECSExternal/md-docs/ecsExternal-createDaemonService.md
@@ -51,7 +51,7 @@ aws ecs list-tasks --cluster ${CLUSTER_NAME} --region ${REGION}
To verify that the data is being sent to SigNoz Cloud, you can go to the dashboard section of SigNoz and import one of the following dashboards below:
- [instancemetrics.json](https://raw.githubusercontent.com/SigNoz/dashboards/chore/ecs-dashboards/ecs-infra-metrics/instance-metrics.json)
-- [hostmetrics-with-variable.json](https://raw.githubusercontent.com/SigNoz/dashboards/main/hostmetrics/hostmetrics-with-variable.json)
+- [hostmetrics.json](https://raw.githubusercontent.com/SigNoz/dashboards/main/hostmetrics/hostmetrics.json)
diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EKS/eks-monitorUsingDashboard.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EKS/eks-monitorUsingDashboard.md
index 77bd5cb87c..bbdba36523 100644
--- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EKS/eks-monitorUsingDashboard.md
+++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EKS/eks-monitorUsingDashboard.md
@@ -1,9 +1,8 @@
## Monitor using Dashboards
-To visualize the Kubernetes Metrics, you can use one of the following pre-built Dashboards:
+To visualize the Kubernetes Metrics, you can use following pre-built Dashboards:
-- [K8s Node-Level Metrics](https://github.com/SigNoz/dashboards/blob/main/k8s-node-%26-pod-metrics/k8s-node-level-metrics.json)
-- [K8s Pod_level Metrics](https://github.com/SigNoz/dashboards/blob/main/k8s-node-%26-pod-metrics/k8s-pod-level-metrics.json)
+- [K8s Infra Metrics](https://github.com/SigNoz/dashboards/tree/main/k8s-infra-metrics)
You should copy the JSON data in these files and create a New Dashboard in the Dashboard Tab of SigNoz.
@@ -13,4 +12,4 @@ By following the previous step, you should also be able to see Kubernetes Pod lo
-To send traces for your application deployed on your Kubernetes cluster, checkout the Application monitoring section of onboarding.
\ No newline at end of file
+To send traces for your application deployed on your Kubernetes cluster, checkout the Application monitoring section of onboarding.
diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
index 97c686e0e7..b6009cb839 100644
--- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
### Step 2: Import hostmetrics JSON file to SigNoz Cloud
diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
index 97c686e0e7..b6009cb839 100644
--- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
### Step 2: Import hostmetrics JSON file to SigNoz Cloud
diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
index 97c686e0e7..b6009cb839 100644
--- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
### Step 2: Import hostmetrics JSON file to SigNoz Cloud
diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
index 97c686e0e7..b6009cb839 100644
--- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
+++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-configureHostmetricsJson.md
@@ -1,6 +1,6 @@
### Step 1: Download/Copy this hostmetrics JSON file
-Download/Copy the `hostmetrics-with-variable.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics-with-variable.json)
+Download/Copy the `hostmetrics.json` from [here](https://github.com/SigNoz/dashboards/blob/main/hostmetrics/hostmetrics.json)
### Step 2: Import hostmetrics JSON file to SigNoz Cloud
diff --git a/frontend/src/container/OptionsMenu/constants.ts b/frontend/src/container/OptionsMenu/constants.ts
index 7b591cd4c5..153981f3c6 100644
--- a/frontend/src/container/OptionsMenu/constants.ts
+++ b/frontend/src/container/OptionsMenu/constants.ts
@@ -7,7 +7,7 @@ export const URL_OPTIONS = 'options';
export const defaultOptionsQuery: OptionsQuery = {
selectColumns: [],
maxLines: 2,
- format: 'list',
+ format: 'raw',
fontSize: FontSize.SMALL,
};
diff --git a/frontend/src/container/OptionsMenu/useOptionsMenu.ts b/frontend/src/container/OptionsMenu/useOptionsMenu.ts
index 7b3cfce035..a4a91d82f4 100644
--- a/frontend/src/container/OptionsMenu/useOptionsMenu.ts
+++ b/frontend/src/container/OptionsMenu/useOptionsMenu.ts
@@ -140,6 +140,11 @@ const useOptionsMenu = ({
return col;
})
.filter(Boolean) as BaseAutocompleteData[];
+
+ // this is the last point where we can set the default columns and if uptil now also we have an empty array then we will set the default columns
+ if (!initialSelected || !initialSelected?.length) {
+ initialSelected = defaultTraceSelectedColumns;
+ }
}
return initialSelected || [];
diff --git a/frontend/src/container/PanelWrapper/TablePanelWrapper.tsx b/frontend/src/container/PanelWrapper/TablePanelWrapper.tsx
index db2098554a..0eab4143a2 100644
--- a/frontend/src/container/PanelWrapper/TablePanelWrapper.tsx
+++ b/frontend/src/container/PanelWrapper/TablePanelWrapper.tsx
@@ -1,3 +1,4 @@
+import { PANEL_TYPES } from 'constants/queryBuilder';
import GridTableComponent from 'container/GridTableComponent';
import { GRID_TABLE_CONFIG } from 'container/GridTableComponent/config';
@@ -18,6 +19,7 @@ function TablePanelWrapper({
thresholds={thresholds}
columnUnits={widget.columnUnits}
tableProcessedDataRef={tableProcessedDataRef}
+ sticky={widget.panelTypes === PANEL_TYPES.TABLE}
// eslint-disable-next-line react/jsx-props-no-spreading
{...GRID_TABLE_CONFIG}
/>
diff --git a/frontend/src/container/PanelWrapper/__tests__/__snapshots__/TablePanelWrapper.test.tsx.snap b/frontend/src/container/PanelWrapper/__tests__/__snapshots__/TablePanelWrapper.test.tsx.snap
index d37ccf5841..1a930f740c 100644
--- a/frontend/src/container/PanelWrapper/__tests__/__snapshots__/TablePanelWrapper.test.tsx.snap
+++ b/frontend/src/container/PanelWrapper/__tests__/__snapshots__/TablePanelWrapper.test.tsx.snap
@@ -70,20 +70,13 @@ exports[`Table panel wrappper tests table should render fine with the query resp
class="ant-table-container"
>
-
-
-
-
+
@@ -222,6 +215,23 @@ exports[`Table panel wrappper tests table should render fine with the query resp
+
+
+
+
+
+
+
+
diff --git a/frontend/src/container/PlannedDowntime/PlannedDowntime.styles.scss b/frontend/src/container/PlannedDowntime/PlannedDowntime.styles.scss
index 41949142fa..b81e4d1e51 100644
--- a/frontend/src/container/PlannedDowntime/PlannedDowntime.styles.scss
+++ b/frontend/src/container/PlannedDowntime/PlannedDowntime.styles.scss
@@ -77,6 +77,18 @@
color: var(--bg-vanilla-400);
}
}
+
+ .formItemWithBullet {
+ margin-bottom: 0;
+ }
+
+ .scheduleTimeInfoText {
+ margin-top: 8px;
+ margin-bottom: 20px;
+ font-size: 12px;
+ font-weight: 400;
+ color: var(--bg-vanilla-400);
+ }
}
.alert-rule-tags {
@@ -543,5 +555,13 @@
background: var(--bg-vanilla-100);
}
}
+
+ .scheduleTimeInfoText {
+ color: var(--bg-slate-300);
+ }
+
+ .alert-rule-info {
+ color: var(--bg-slate-300);
+ }
}
}
diff --git a/frontend/src/container/PlannedDowntime/PlannedDowntimeForm.tsx b/frontend/src/container/PlannedDowntime/PlannedDowntimeForm.tsx
index 76b0507558..94d1a5d6eb 100644
--- a/frontend/src/container/PlannedDowntime/PlannedDowntimeForm.tsx
+++ b/frontend/src/container/PlannedDowntime/PlannedDowntimeForm.tsx
@@ -41,7 +41,7 @@ import {
getAlertOptionsFromIds,
getDurationInfo,
getEndTime,
- handleTimeConvertion,
+ handleTimeConversion,
isScheduleRecurring,
recurrenceOptions,
recurrenceOptionWithSubmenu,
@@ -52,6 +52,10 @@ dayjs.locale('en');
dayjs.extend(utc);
dayjs.extend(timezone);
+const TIME_FORMAT = 'HH:mm';
+const DATE_FORMAT = 'Do MMM YYYY';
+const ORDINAL_FORMAT = 'Do';
+
interface PlannedDowntimeFormData {
name: string;
startTime: dayjs.Dayjs | string;
@@ -105,6 +109,10 @@ export function PlannedDowntimeForm(
?.unit || 'm',
);
+ const [formData, setFormData] = useState(
+ initialValues?.schedule as PlannedDowntimeFormData,
+ );
+
const [recurrenceType, setRecurrenceType] = useState(
(initialValues.schedule?.recurrence?.repeatType as string) ||
recurrenceOptions.doesNotRepeat.value,
@@ -131,7 +139,7 @@ export function PlannedDowntimeForm(
.filter((alert) => alert !== undefined) as string[],
name: values.name,
schedule: {
- startTime: handleTimeConvertion(
+ startTime: handleTimeConversion(
values.startTime,
timezoneInitialValue,
values.timezone,
@@ -139,7 +147,7 @@ export function PlannedDowntimeForm(
),
timezone: values.timezone,
endTime: values.endTime
- ? handleTimeConvertion(
+ ? handleTimeConversion(
values.endTime,
timezoneInitialValue,
values.timezone,
@@ -196,14 +204,14 @@ export function PlannedDowntimeForm(
? `${values.recurrence?.duration}${durationUnit}`
: undefined,
endTime: !isEmpty(values.endTime)
- ? handleTimeConvertion(
+ ? handleTimeConversion(
values.endTime,
timezoneInitialValue,
values.timezone,
!isEditMode,
)
: undefined,
- startTime: handleTimeConvertion(
+ startTime: handleTimeConversion(
values.startTime,
timezoneInitialValue,
values.timezone,
@@ -300,6 +308,116 @@ export function PlannedDowntimeForm(
}),
);
+ const getTimezoneFormattedTime = (
+ time: string | dayjs.Dayjs,
+ timeZone?: string,
+ isEditMode?: boolean,
+ format?: string,
+ ): string => {
+ if (!time) {
+ return '';
+ }
+ if (!timeZone) {
+ return dayjs(time).format(format);
+ }
+ return dayjs(time).tz(timeZone, isEditMode).format(format);
+ };
+
+ const startTimeText = useMemo((): string => {
+ let startTime = formData?.startTime;
+ if (recurrenceType !== recurrenceOptions.doesNotRepeat.value) {
+ startTime = formData?.recurrence?.startTime || formData?.startTime || '';
+ }
+
+ if (!startTime) {
+ return '';
+ }
+
+ if (formData.timezone) {
+ startTime = handleTimeConversion(
+ startTime,
+ timezoneInitialValue,
+ formData?.timezone,
+ !isEditMode,
+ );
+ }
+ const daysOfWeek = formData?.recurrence?.repeatOn;
+
+ const formattedStartTime = getTimezoneFormattedTime(
+ startTime,
+ formData.timezone,
+ !isEditMode,
+ TIME_FORMAT,
+ );
+
+ const formattedStartDate = getTimezoneFormattedTime(
+ startTime,
+ formData.timezone,
+ !isEditMode,
+ DATE_FORMAT,
+ );
+
+ const ordinalFormat = getTimezoneFormattedTime(
+ startTime,
+ formData.timezone,
+ !isEditMode,
+ ORDINAL_FORMAT,
+ );
+
+ const formattedDaysOfWeek = daysOfWeek?.join(', ');
+ switch (recurrenceType) {
+ case 'daily':
+ return `Scheduled from ${formattedStartDate}, daily starting at ${formattedStartTime}.`;
+ case 'monthly':
+ return `Scheduled from ${formattedStartDate}, monthly on the ${ordinalFormat} starting at ${formattedStartTime}.`;
+ case 'weekly':
+ return `Scheduled from ${formattedStartDate}, weekly ${
+ formattedDaysOfWeek ? `on [${formattedDaysOfWeek}]` : ''
+ } starting at ${formattedStartTime}`;
+ default:
+ return `Scheduled for ${formattedStartDate} starting at ${formattedStartTime}.`;
+ }
+ }, [formData, recurrenceType, isEditMode, timezoneInitialValue]);
+
+ const endTimeText = useMemo((): string => {
+ let endTime = formData?.endTime;
+ if (recurrenceType !== recurrenceOptions.doesNotRepeat.value) {
+ endTime = formData?.recurrence?.endTime || '';
+
+ if (!isEditMode && !endTime) {
+ endTime = formData?.endTime || '';
+ }
+ }
+
+ if (!endTime) {
+ return '';
+ }
+
+ if (formData.timezone) {
+ endTime = handleTimeConversion(
+ endTime,
+ timezoneInitialValue,
+ formData?.timezone,
+ !isEditMode,
+ );
+ }
+
+ const formattedEndTime = getTimezoneFormattedTime(
+ endTime,
+ formData.timezone,
+ !isEditMode,
+ TIME_FORMAT,
+ );
+
+ const formattedEndDate = getTimezoneFormattedTime(
+ endTime,
+ formData.timezone,
+ !isEditMode,
+ DATE_FORMAT,
+ );
+ return `Scheduled to end maintenance on ${formattedEndDate} at ${formattedEndTime}.`;
+ }, [formData, recurrenceType, isEditMode, timezoneInitialValue]);
+
return (
{
setRecurrenceType(form.getFieldValue('recurrence')?.repeatType as string);
+ setFormData(form.getFieldsValue());
}}
autoComplete="off"
>
@@ -333,7 +452,7 @@ export function PlannedDowntimeForm(
label="Starts from"
name="startTime"
rules={formValidationRules}
- className="formItemWithBullet"
+ className={!isEmpty(startTimeText) ? 'formItemWithBullet' : ''}
getValueProps={(value): any => ({
value: value ? dayjs(value).tz(timezoneInitialValue) : undefined,
})}
@@ -348,6 +467,9 @@ export function PlannedDowntimeForm(
popupClassName="datePicker"
/>
+ {!isEmpty(startTimeText) && (
+ {startTimeText}
+ )}
({
value: value ? dayjs(value).tz(timezoneInitialValue) : undefined,
})}
@@ -426,6 +548,9 @@ export function PlannedDowntimeForm(
popupClassName="datePicker"
/>
+ {!isEmpty(endTimeText) && (
+ {endTimeText}
+ )}
Silence Alerts
diff --git a/frontend/src/container/PlannedDowntime/PlannedDowntimeutils.ts b/frontend/src/container/PlannedDowntime/PlannedDowntimeutils.ts
index 7d0745dc5e..feba0cb13e 100644
--- a/frontend/src/container/PlannedDowntime/PlannedDowntimeutils.ts
+++ b/frontend/src/container/PlannedDowntime/PlannedDowntimeutils.ts
@@ -262,7 +262,7 @@ export function formatWithTimezone(
return `${parsedDate?.substring(0, 19)}${targetOffset}`;
}
-export function handleTimeConvertion(
+export function handleTimeConversion(
dateValue: string | dayjs.Dayjs,
timezoneInit?: string,
timezone?: string,
diff --git a/frontend/src/container/QueryBuilder/QueryBuilder.styles.scss b/frontend/src/container/QueryBuilder/QueryBuilder.styles.scss
index dbb7a962ef..7cac6794c5 100644
--- a/frontend/src/container/QueryBuilder/QueryBuilder.styles.scss
+++ b/frontend/src/container/QueryBuilder/QueryBuilder.styles.scss
@@ -77,6 +77,12 @@
border: 1px solid rgba(242, 71, 105, 0.4);
color: var(--bg-sakura-400);
}
+
+ &.sync-btn {
+ border: 1px solid rgba(78, 116, 248, 0.2);
+ background: rgba(78, 116, 248, 0.1);
+ color: var(--bg-robin-500);
+ }
}
&.formula-btn {
diff --git a/frontend/src/container/QueryBuilder/QueryBuilder.tsx b/frontend/src/container/QueryBuilder/QueryBuilder.tsx
index 844f9e3ab3..5726087e6d 100644
--- a/frontend/src/container/QueryBuilder/QueryBuilder.tsx
+++ b/frontend/src/container/QueryBuilder/QueryBuilder.tsx
@@ -1,17 +1,20 @@
import './QueryBuilder.styles.scss';
import { Button, Col, Divider, Row, Tooltip, Typography } from 'antd';
+import cx from 'classnames';
import {
MAX_FORMULAS,
MAX_QUERIES,
OPERATORS,
PANEL_TYPES,
} from 'constants/queryBuilder';
+import ROUTES from 'constants/routes';
// ** Hooks
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
import { DatabaseZap, Sigma } from 'lucide-react';
// ** Constants
import { memo, useEffect, useMemo, useRef } from 'react';
+import { useLocation } from 'react-router-dom';
import { DataSource } from 'types/common/queryBuilder';
// ** Components
@@ -35,6 +38,8 @@ export const QueryBuilder = memo(function QueryBuilder({
handleSetConfig,
panelType,
initialDataSource,
+ setLastUsedQuery,
+ lastUsedQuery,
} = useQueryBuilder();
const containerRef = useRef(null);
@@ -46,6 +51,10 @@ export const QueryBuilder = memo(function QueryBuilder({
[config],
);
+ const { pathname } = useLocation();
+
+ const isLogsExplorerPage = pathname === ROUTES.LOGS_EXPLORER;
+
useEffect(() => {
if (currentDataSource !== initialDataSource || newPanelType !== panelType) {
if (newPanelType === PANEL_TYPES.BAR) {
@@ -212,6 +221,7 @@ export const QueryBuilder = memo(function QueryBuilder({
setLastUsedQuery(index)}
className="query"
id={`qb-query-${query.queryName}`}
>
@@ -265,10 +275,13 @@ export const QueryBuilder = memo(function QueryBuilder({
{!isListViewPanel && (
- {currentQuery.builder.queryData.map((query) => (
+ {currentQuery.builder.queryData.map((query, index) => (