Skip to content

Commit 10bcd2a

Browse files
committed
update relation graph
1 parent 31fd1de commit 10bcd2a

File tree

2 files changed

+35
-27
lines changed

2 files changed

+35
-27
lines changed

dashboard/components/RelationGraph.tsx

+16-11
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
epochToUnixMillis,
4141
latencyToColor,
4242
} from "./utils/backPressure"
43+
import { ChannelStatsDerived } from "../pages/fragment_graph"
4344

4445
// Size of each relation box in pixels
4546
export const boxWidth = 150
@@ -74,13 +75,13 @@ export default function RelationGraph({
7475
nodes,
7576
selectedId,
7677
setSelectedId,
77-
backPressures,
78+
channelStats,
7879
relationStats,
7980
}: {
8081
nodes: RelationPoint[] // rename to RelationNode
8182
selectedId: string | undefined
8283
setSelectedId: (id: string) => void
83-
backPressures?: Map<string, number> // relationId-relationId->back_pressure_rate})
84+
channelStats?: Map<string, ChannelStatsDerived>
8485
relationStats: { [relationId: number]: RelationStats } | undefined
8586
}) {
8687
const [modalData, setModalId] = useCatalogModal(nodes.map((n) => n.relation))
@@ -173,21 +174,21 @@ export default function RelationGraph({
173174

174175
const applyEdge = (sel: EdgeSelection) => {
175176
const color = (d: Edge) => {
176-
if (backPressures) {
177-
let value = backPressures.get(`${d.source}_${d.target}`)
177+
if (channelStats) {
178+
let value = channelStats.get(`${d.source}_${d.target}`)
178179
if (value) {
179-
return backPressureColor(value)
180+
return backPressureColor(value.backPressure)
180181
}
181182
}
182183

183184
return theme.colors.gray["300"]
184185
}
185186

186187
const width = (d: Edge) => {
187-
if (backPressures) {
188-
let value = backPressures.get(`${d.source}_${d.target}`)
188+
if (channelStats) {
189+
let value = channelStats.get(`${d.source}_${d.target}`)
189190
if (value) {
190-
return backPressureWidth(value, 15)
191+
return backPressureWidth(value.backPressure, 15)
191192
}
192193
}
193194
return 2
@@ -208,11 +209,15 @@ export default function RelationGraph({
208209
d3.selectAll(".tooltip").remove()
209210

210211
// Create new tooltip
211-
const bpValue = backPressures?.get(`${d.source}_${d.target}`)
212+
const stats = channelStats?.get(`${d.source}_${d.target}`)
212213
const tooltipText = `<b>Relation ${d.source}${
213214
d.target
214215
}</b><br>Backpressure: ${
215-
bpValue != null ? `${(bpValue * 100).toFixed(2)}%` : "N/A"
216+
stats != null ? `${(stats.backPressure * 100).toFixed(2)}%` : "N/A"
217+
}<br>Input Throughput: ${
218+
stats != null ? `${stats.inputThroughput.toFixed(2)} rows/s` : "N/A"
219+
}<br>Output Throughput: ${
220+
stats != null ? `${stats.outputThroughput.toFixed(2)} rows/s` : "N/A"
216221
}`
217222
d3.select("body")
218223
.append("div")
@@ -421,7 +426,7 @@ export default function RelationGraph({
421426
selectedId,
422427
setModalId,
423428
setSelectedId,
424-
backPressures,
429+
channelStats,
425430
relationStats,
426431
])
427432

dashboard/pages/relation_graph.tsx

+19-16
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ import {
3434
} from "../lib/api/streaming"
3535
import { RelationPoint } from "../lib/layout"
3636
import { RelationStats } from "../proto/gen/monitor_service"
37-
import { ChannelStatsSnapshot } from "./fragment_graph"
37+
import { ChannelStatsDerived, ChannelStatsSnapshot } from "./fragment_graph"
38+
import { GetBackPressureResponse } from "../proto/gen/monitor_service"
3839

3940
const SIDEBAR_WIDTH = "200px"
4041
const INTERVAL_MS = 5000
@@ -96,8 +97,8 @@ export default function StreamingGraph() {
9697
const relationDependency = relationDependencyCallback()
9798

9899
// Periodically fetch fragment-level back-pressure from Meta node
99-
const [backPressureRate, setBackPressureRate] =
100-
useState<Map<string, number>>()
100+
const [channelStats, setChannelStats] =
101+
useState<Map<string, ChannelStatsDerived>>()
101102
const [relationStats, setRelationStats] = useState<{
102103
[key: number]: RelationStats
103104
}>()
@@ -108,20 +109,22 @@ export default function StreamingGraph() {
108109
let initialSnapshot: ChannelStatsSnapshot | undefined
109110

110111
if (resetEmbeddedBackPressures) {
111-
setBackPressureRate(undefined)
112+
setChannelStats(undefined)
112113
toggleResetEmbeddedBackPressures()
113114
}
114115

115116
function refresh() {
116117
api.get("/metrics/fragment/embedded_back_pressures").then(
117-
(response) => {
118-
let snapshot = ChannelStatsSnapshot.fromResponse(
119-
response.channelStats
118+
(res) => {
119+
let response = GetBackPressureResponse.fromJSON(res)
120+
let snapshot = new ChannelStatsSnapshot(
121+
new Map(Object.entries(response.channelStats)),
122+
Date.now()
120123
)
121124
if (!initialSnapshot) {
122125
initialSnapshot = snapshot
123126
} else {
124-
setBackPressureRate(snapshot.getRate(initialSnapshot!))
127+
setChannelStats(snapshot.getRate(initialSnapshot))
125128
}
126129
setRelationStats(response.relationStats)
127130
},
@@ -139,26 +142,26 @@ export default function StreamingGraph() {
139142
}, [toast, resetEmbeddedBackPressures])
140143

141144
// Convert fragment-level backpressure rate map to relation-level backpressure rate
142-
const backPressures: Map<string, number> | undefined = useMemo(() => {
145+
const relationChannelStats: Map<string, ChannelStatsDerived> | undefined = useMemo(() => {
143146
if (!fragmentVertexToRelationMap) {
144-
return new Map<string, number>()
147+
return new Map<string, ChannelStatsDerived>()
145148
}
146149
let inMap = fragmentVertexToRelationMap.inMap
147150
let outMap = fragmentVertexToRelationMap.outMap
148-
if (backPressureRate) {
149-
let map = new Map<string, number>()
150-
for (const [key, value] of backPressureRate) {
151+
if (channelStats) {
152+
let map = new Map<string, ChannelStatsDerived>()
153+
for (const [key, stats] of channelStats) {
151154
const [outputFragment, inputFragment] = key.split("_").map(Number)
152155
if (outMap[outputFragment] && inMap[inputFragment]) {
153156
const outputRelation = outMap[outputFragment]
154157
const inputRelation = inMap[inputFragment]
155158
let key = `${outputRelation}_${inputRelation}`
156-
map.set(key, value)
159+
map.set(key, stats)
157160
}
158161
}
159162
return map
160163
}
161-
}, [backPressureRate, fragmentVertexToRelationMap])
164+
}, [channelStats, fragmentVertexToRelationMap])
162165

163166
const retVal = (
164167
<Flex p={3} height="calc(100vh - 20px)" flexDirection="column">
@@ -214,7 +217,7 @@ export default function StreamingGraph() {
214217
nodes={relationDependency}
215218
selectedId={selectedId?.toString()}
216219
setSelectedId={(id) => setSelectedId(parseInt(id))}
217-
backPressures={backPressures}
220+
channelStats={relationChannelStats}
218221
relationStats={relationStats}
219222
/>
220223
)}

0 commit comments

Comments
 (0)