|
1 | 1 | import { useEffect, useState } from "react"; |
2 | 2 | import { useSearchParams } from "react-router-dom"; |
3 | | -import { listTraces, type TraceSummary } from "../api"; |
| 3 | +import { listTraces, listServices, type TraceSummary } from "../api"; |
4 | 4 | import { useControls, rangeParams } from "../timerange"; |
5 | 5 | import { useSort } from "../sort"; |
6 | 6 |
|
@@ -28,6 +28,18 @@ export default function TraceList({ onSelect }: { onSelect: (traceId: string) => |
28 | 28 | const [attr, setAttr] = useState(""); |
29 | 29 | const [errorsOnly, setErrorsOnly] = useState(false); |
30 | 30 | const [minDuration, setMinDuration] = useState(""); |
| 31 | + const [services, setServices] = useState<string[]>([]); |
| 32 | + |
| 33 | + // Populate the service dropdown from the services that have traces in range. |
| 34 | + useEffect(() => { |
| 35 | + let active = true; |
| 36 | + listServices(rangeParams(rangeKey)) |
| 37 | + .then((rows) => active && setServices(rows.map((r) => r.service).sort())) |
| 38 | + .catch(() => active && setServices([])); |
| 39 | + return () => { |
| 40 | + active = false; |
| 41 | + }; |
| 42 | + }, [rangeKey, tick]); |
31 | 43 |
|
32 | 44 | useEffect(() => { |
33 | 45 | let active = true; |
@@ -61,11 +73,17 @@ export default function TraceList({ onSelect }: { onSelect: (traceId: string) => |
61 | 73 |
|
62 | 74 | const filters = ( |
63 | 75 | <div className="filters"> |
64 | | - <input |
65 | | - placeholder="service" |
66 | | - value={service} |
67 | | - onChange={(e) => setService(e.target.value)} |
68 | | - /> |
| 76 | + <select value={service} onChange={(e) => setService(e.target.value)}> |
| 77 | + <option value="">all services</option> |
| 78 | + {/* keep a drill-down service selectable even if it's outside the window's list */} |
| 79 | + {(services.includes(service) || !service ? services : [service, ...services]).map( |
| 80 | + (s) => ( |
| 81 | + <option key={s} value={s}> |
| 82 | + {s} |
| 83 | + </option> |
| 84 | + ), |
| 85 | + )} |
| 86 | + </select> |
69 | 87 | <input |
70 | 88 | placeholder="root span name…" |
71 | 89 | value={name} |
|
0 commit comments