This is an automated email from the ASF dual-hosted git repository.
bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new ac0501db66d Wait for config API to avoid NaN passed to offset.
(#44989)
ac0501db66d is described below
commit ac0501db66dac363cf7046682d46cbc03b056693
Author: Karthikeyan Singaravelan <[email protected]>
AuthorDate: Thu Dec 19 23:10:10 2024 +0530
Wait for config API to avoid NaN passed to offset. (#44989)
* Fix NaNs when end_date is not defined.
Fix NaN passed to limit param in API by waiting for config API.
Fix recent task instances sort order.
* Fix NaN offset in XCom page.
* Add getDuration util function.
---
airflow/ui/src/pages/Dag/Runs/Runs.tsx | 23 ++++++++++++----------
airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx | 4 +++-
airflow/ui/src/pages/Dag/Tasks/Tasks.tsx | 6 ++----
airflow/ui/src/pages/Events/Events.tsx | 20 +++++++++++--------
airflow/ui/src/pages/Run/Header.tsx | 8 ++------
airflow/ui/src/pages/Run/TaskInstances.tsx | 22 ++++++++++++---------
airflow/ui/src/pages/TaskInstance/Header.tsx | 8 ++------
airflow/ui/src/pages/XCom/XCom.tsx | 20 +++++++++++--------
airflow/ui/src/queries/useDags.tsx | 6 ++++--
.../ui/src/utils/{index.ts => datetime_utils.ts} | 8 ++++++--
airflow/ui/src/utils/index.ts | 1 +
11 files changed, 70 insertions(+), 56 deletions(-)
diff --git a/airflow/ui/src/pages/Dag/Runs/Runs.tsx
b/airflow/ui/src/pages/Dag/Runs/Runs.tsx
index 3d8be5adf68..843316e606b 100644
--- a/airflow/ui/src/pages/Dag/Runs/Runs.tsx
+++ b/airflow/ui/src/pages/Dag/Runs/Runs.tsx
@@ -26,7 +26,6 @@ import {
Text,
} from "@chakra-ui/react";
import type { ColumnDef } from "@tanstack/react-table";
-import dayjs from "dayjs";
import { useCallback } from "react";
import {
useParams,
@@ -43,7 +42,7 @@ import { ErrorAlert } from "src/components/ErrorAlert";
import { RunTypeIcon } from "src/components/RunTypeIcon";
import Time from "src/components/Time";
import { Select, Status } from "src/components/ui";
-import { capitalize } from "src/utils";
+import { capitalize, getDuration } from "src/utils";
const columns: Array<ColumnDef<DAGRunResponse>> = [
{
@@ -90,7 +89,7 @@ const columns: Array<ColumnDef<DAGRunResponse>> = [
},
{
cell: ({ row: { original } }) =>
-
`${dayjs.duration(dayjs(original.end_date).diff(original.start_date)).asSeconds().toFixed(2)}s`,
+ getDuration(original.start_date, original.end_date),
header: "Duration",
},
{
@@ -133,13 +132,17 @@ export const Runs = () => {
const filteredState = searchParams.get(STATE_PARAM);
- const { data, error, isFetching, isLoading } = useDagRunServiceGetDagRuns({
- dagId: dagId ?? "~",
- limit: pagination.pageSize,
- offset: pagination.pageIndex * pagination.pageSize,
- orderBy,
- state: filteredState === null ? undefined : [filteredState],
- });
+ const { data, error, isFetching, isLoading } = useDagRunServiceGetDagRuns(
+ {
+ dagId: dagId ?? "~",
+ limit: pagination.pageSize,
+ offset: pagination.pageIndex * pagination.pageSize,
+ orderBy,
+ state: filteredState === null ? undefined : [filteredState],
+ },
+ undefined,
+ { enabled: !isNaN(pagination.pageSize) },
+ );
const handleStateChange = useCallback(
({ value }: SelectValueChangeDetails<string>) => {
diff --git a/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx
b/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx
index 02f34f89679..86c125db639 100644
--- a/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx
+++ b/airflow/ui/src/pages/Dag/Tasks/TaskRecentRuns.tsx
@@ -42,7 +42,9 @@ export const TaskRecentRuns = ({
...taskInstance,
duration:
dayjs
- .duration(dayjs(taskInstance.end_date).diff(taskInstance.start_date))
+ .duration(
+ dayjs(taskInstance.end_date ??
dayjs()).diff(taskInstance.start_date),
+ )
.asSeconds() || 0,
}));
diff --git a/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx
b/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx
index cfc4eb3f2fb..6701a8a1f4e 100644
--- a/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx
+++ b/airflow/ui/src/pages/Dag/Tasks/Tasks.tsx
@@ -89,6 +89,7 @@ export const Tasks = () => {
dagId,
dagRunId: "~",
logicalDateGte: runs.at(-1)?.logical_date ?? "",
+ orderBy: "-start_date",
},
undefined,
{ enabled: Boolean(runs[0]?.dag_run_id) },
@@ -101,10 +102,7 @@ export const Tasks = () => {
{pluralize("Task", data ? data.total_entries : 0)}
</Heading>
<DataTable
- cardDef={cardDef(
- dagId,
- taskInstancesResponse?.task_instances.reverse(),
- )}
+ cardDef={cardDef(dagId, taskInstancesResponse?.task_instances)}
columns={[]}
data={data ? data.tasks : []}
displayMode="card"
diff --git a/airflow/ui/src/pages/Events/Events.tsx
b/airflow/ui/src/pages/Events/Events.tsx
index 95c7b888a81..f93d8a07526 100644
--- a/airflow/ui/src/pages/Events/Events.tsx
+++ b/airflow/ui/src/pages/Events/Events.tsx
@@ -124,14 +124,18 @@ export const Events = () => {
error: EventsError,
isFetching,
isLoading,
- } = useEventLogServiceGetEventLogs({
- dagId,
- limit: pagination.pageSize,
- offset: pagination.pageIndex * pagination.pageSize,
- orderBy,
- runId,
- taskId,
- });
+ } = useEventLogServiceGetEventLogs(
+ {
+ dagId,
+ limit: pagination.pageSize,
+ offset: pagination.pageIndex * pagination.pageSize,
+ orderBy,
+ runId,
+ taskId,
+ },
+ undefined,
+ { enabled: !isNaN(pagination.pageSize) },
+ );
return (
<Box>
diff --git a/airflow/ui/src/pages/Run/Header.tsx
b/airflow/ui/src/pages/Run/Header.tsx
index 6d439d2f8fc..47c0b252a9b 100644
--- a/airflow/ui/src/pages/Run/Header.tsx
+++ b/airflow/ui/src/pages/Run/Header.tsx
@@ -17,7 +17,6 @@
* under the License.
*/
import { Box, Flex, Heading, HStack, SimpleGrid, Text } from
"@chakra-ui/react";
-import dayjs from "dayjs";
import { FiBarChart } from "react-icons/fi";
import { MdOutlineModeComment } from "react-icons/md";
@@ -27,6 +26,7 @@ import { RunTypeIcon } from "src/components/RunTypeIcon";
import { Stat } from "src/components/Stat";
import Time from "src/components/Time";
import { Status } from "src/components/ui";
+import { getDuration } from "src/utils";
export const Header = ({ dagRun }: { readonly dagRun: DAGRunResponse }) => (
<Box borderColor="border" borderRadius={8} borderWidth={1} p={2}>
@@ -68,11 +68,7 @@ export const Header = ({ dagRun }: { readonly dagRun:
DAGRunResponse }) => (
<Time datetime={dagRun.end_date} />
</Stat>
<Stat label="Duration">
- {dayjs
- .duration(dayjs(dagRun.end_date).diff(dagRun.start_date))
- .asSeconds()
- .toFixed(2)}
- s
+ {getDuration(dagRun.start_date, dagRun.end_date)}s
</Stat>
</SimpleGrid>
</Box>
diff --git a/airflow/ui/src/pages/Run/TaskInstances.tsx
b/airflow/ui/src/pages/Run/TaskInstances.tsx
index 3cb9ceb5283..c6cef5cf653 100644
--- a/airflow/ui/src/pages/Run/TaskInstances.tsx
+++ b/airflow/ui/src/pages/Run/TaskInstances.tsx
@@ -18,7 +18,6 @@
*/
import { Box, Link } from "@chakra-ui/react";
import type { ColumnDef } from "@tanstack/react-table";
-import dayjs from "dayjs";
import { Link as RouterLink, useParams } from "react-router-dom";
import { useTaskInstanceServiceGetTaskInstances } from "openapi/queries";
@@ -28,6 +27,7 @@ import { useTableURLState } from
"src/components/DataTable/useTableUrlState";
import { ErrorAlert } from "src/components/ErrorAlert";
import Time from "src/components/Time";
import { Status } from "src/components/ui";
+import { getDuration } from "src/utils";
const columns: Array<ColumnDef<TaskInstanceResponse>> = [
{
@@ -82,7 +82,7 @@ const columns: Array<ColumnDef<TaskInstanceResponse>> = [
{
cell: ({ row: { original } }) =>
-
`${dayjs.duration(dayjs(original.end_date).diff(original.start_date)).asSeconds().toFixed(2)}s`,
+ `${getDuration(original.start_date, original.end_date)}s`,
header: "Duration",
},
];
@@ -95,13 +95,17 @@ export const TaskInstances = () => {
const orderBy = sort ? `${sort.desc ? "-" : ""}${sort.id}` : "-start_date";
const { data, error, isFetching, isLoading } =
- useTaskInstanceServiceGetTaskInstances({
- dagId,
- dagRunId: runId,
- limit: pagination.pageSize,
- offset: pagination.pageIndex * pagination.pageSize,
- orderBy,
- });
+ useTaskInstanceServiceGetTaskInstances(
+ {
+ dagId,
+ dagRunId: runId,
+ limit: pagination.pageSize,
+ offset: pagination.pageIndex * pagination.pageSize,
+ orderBy,
+ },
+ undefined,
+ { enabled: !isNaN(pagination.pageSize) },
+ );
return (
<Box>
diff --git a/airflow/ui/src/pages/TaskInstance/Header.tsx
b/airflow/ui/src/pages/TaskInstance/Header.tsx
index c8722fa4ff3..4d1a3b84803 100644
--- a/airflow/ui/src/pages/TaskInstance/Header.tsx
+++ b/airflow/ui/src/pages/TaskInstance/Header.tsx
@@ -17,13 +17,13 @@
* under the License.
*/
import { Box, Flex, Heading, HStack, SimpleGrid, Text } from
"@chakra-ui/react";
-import dayjs from "dayjs";
import { MdOutlineModeComment, MdOutlineTask } from "react-icons/md";
import type { TaskInstanceResponse } from "openapi/requests/types.gen";
import { Stat } from "src/components/Stat";
import Time from "src/components/Time";
import { Status } from "src/components/ui";
+import { getDuration } from "src/utils";
export const Header = ({
taskInstance,
@@ -71,11 +71,7 @@ export const Header = ({
<Time datetime={taskInstance.end_date} />
</Stat>
<Stat label="Duration">
- {dayjs
- .duration(dayjs(taskInstance.end_date).diff(taskInstance.start_date))
- .asSeconds()
- .toFixed(2)}
- s
+ {getDuration(taskInstance.start_date, taskInstance.end_date)}s
</Stat>
</SimpleGrid>
</Box>
diff --git a/airflow/ui/src/pages/XCom/XCom.tsx
b/airflow/ui/src/pages/XCom/XCom.tsx
index 13fa99b1021..f309d2532da 100644
--- a/airflow/ui/src/pages/XCom/XCom.tsx
+++ b/airflow/ui/src/pages/XCom/XCom.tsx
@@ -58,14 +58,18 @@ export const XCom = () => {
const { setTableURLState, tableURLState } = useTableURLState();
const { pagination } = tableURLState;
- const { data, error, isFetching, isLoading } = useXcomServiceGetXcomEntries({
- dagId,
- dagRunId: runId,
- limit: pagination.pageSize,
- mapIndex,
- offset: pagination.pageIndex * pagination.pageSize,
- taskId,
- });
+ const { data, error, isFetching, isLoading } = useXcomServiceGetXcomEntries(
+ {
+ dagId,
+ dagRunId: runId,
+ limit: pagination.pageSize,
+ mapIndex,
+ offset: pagination.pageIndex * pagination.pageSize,
+ taskId,
+ },
+ undefined,
+ { enabled: !isNaN(pagination.pageSize) },
+ );
return (
<Box>
diff --git a/airflow/ui/src/queries/useDags.tsx
b/airflow/ui/src/queries/useDags.tsx
index 09f1562fc41..a19592796d3 100644
--- a/airflow/ui/src/queries/useDags.tsx
+++ b/airflow/ui/src/queries/useDags.tsx
@@ -50,10 +50,12 @@ export const useDags = (
tags?: Array<string>;
} = {},
) => {
+ const offsetDefined =
+ searchParams.offset === undefined ? false : !isNaN(searchParams.offset);
const { data, error, isFetching, isLoading } = useDagServiceGetDags(
searchParams,
undefined,
- queryOptions,
+ { ...queryOptions, enabled: offsetDefined },
);
const { orderBy, ...runsParams } = searchParams;
@@ -68,7 +70,7 @@ export const useDags = (
dagRunsLimit: 14,
},
undefined,
- queryOptions,
+ { ...queryOptions, enabled: offsetDefined },
);
const dags = (data?.dags ?? []).map((dag) => {
diff --git a/airflow/ui/src/utils/index.ts
b/airflow/ui/src/utils/datetime_utils.ts
similarity index 78%
copy from airflow/ui/src/utils/index.ts
copy to airflow/ui/src/utils/datetime_utils.ts
index 7083089c2b1..d1660050be7 100644
--- a/airflow/ui/src/utils/index.ts
+++ b/airflow/ui/src/utils/datetime_utils.ts
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+import dayjs from "dayjs";
-export { capitalize } from "./capitalize";
-export { pluralize } from "./pluralize";
+export const getDuration = (startDate: string | null, endDate: string | null)
=>
+ dayjs
+ .duration(dayjs(endDate ?? undefined).diff(startDate ?? undefined))
+ .asSeconds()
+ .toFixed(2);
diff --git a/airflow/ui/src/utils/index.ts b/airflow/ui/src/utils/index.ts
index 7083089c2b1..bdfe8ac8d80 100644
--- a/airflow/ui/src/utils/index.ts
+++ b/airflow/ui/src/utils/index.ts
@@ -19,3 +19,4 @@
export { capitalize } from "./capitalize";
export { pluralize } from "./pluralize";
+export { getDuration } from "./datetime_utils";