Checkpointing work, need to add resolutions for actions

This commit is contained in:
Kinesin Data Technologies Incorporated
2022-10-07 16:40:31 -03:00
parent 2e89c1bac2
commit 304e04cca9
3 changed files with 88 additions and 1 deletions
+54
View File
@@ -197,6 +197,60 @@ async fn get_detailed_timeline(
} }
} }
/// Retrieve all data about a segment, including:
/// What resources it relies on
/// Last attempt (if any)
async fn get_segment_details(
span: web::Json<Interval>,
state: web::Data<AppState>,
) -> impl Responder {
let interval = span.into_inner();
let (response, rx) = oneshot::channel();
state
.runner_tx
.send(RunnerMessage::GetResourceStateDetails { interval, response })
.unwrap();
match rx.await {
Ok(actions) => {
let mut timeline = Vec::new();
info!(
"Querying for actions over {}, got {} responses.",
interval,
actions.len()
);
for (resource, tasks) in actions {
let mut group = TimelineGroup {
group: resource.clone(),
data: Vec::new(),
};
for (task_name, intervals) in tasks.into_iter() {
let data = intervals
.into_iter()
.map(|a| TimelineInterval {
time_range: [a.interval.start, a.interval.end],
val: a.state,
})
.collect();
group.data.push(TimelineLabel {
label: task_name,
data,
});
}
timeline.push(group);
}
HttpResponse::Ok().json(timeline)
}
Err(error) => HttpResponse::BadRequest().json(SimpleError {
error: format!("{:?}", error),
}),
}
}
/* /*
async fn stop_run(path: web::Path<RunID>, state: web::Data<AppState>) -> impl Responder { async fn stop_run(path: web::Path<RunID>, state: web::Data<AppState>) -> impl Responder {
let run_id = path.into_inner(); let run_id = path.into_inner();
+2
View File
@@ -12,6 +12,7 @@ export default {
<th>Resource</th> <th>Resource</th>
<th>Task Name</th> <th>Task Name</th>
<th>Interval</th> <th>Interval</th>
<th>State</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -19,6 +20,7 @@ export default {
<td>{{activeSegment.group}}</td> <td>{{activeSegment.group}}</td>
<td>{{activeSegment.label}}</td> <td>{{activeSegment.label}}</td>
<td>{{activeSegment.timeRange}}</td> <td>{{activeSegment.timeRange}}</td>
<td>{{activeSegment.val}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
+32 -1
View File
@@ -1,12 +1,28 @@
<script> <script>
// import TimelinesChart from 'timelines-chart'; // import TimelinesChart from 'timelines-chart';
function lexsort(a, b, keyfunc) {
const ka = keyfunc(a);
const kb = keyfunc(b);
let ret = 0;
if (ka < kb) { ret = -1; }
if (ka > kb) { ret = 1; }
return ret;
}
const MIN_TIME="1970-01-01T00:00:00Z";
const MAX_TIME="2099-01-01T00:00:00Z";
export default { export default {
props: ['waterfallURL', 'refreshSeconds'], props: ['waterfallURL', 'refreshSeconds'],
data() { data() {
return { return {
chart: null, chart: null,
data: {}, data: {},
start: MIN_TIME,
end: MAX_TIME,
} }
}, },
@@ -26,7 +42,7 @@ export default {
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: '{ "start": "2021-09-01T00:00:00Z", "end": "2022-10-01T00:00:00Z" }' body: `{ "start": "${this.start}", "end": "${this.end}" }`
}) })
.then((response) => { .then((response) => {
if (!response.ok) { if (!response.ok) {
@@ -36,12 +52,15 @@ export default {
}) })
.then((payload) => { .then((payload) => {
payload.map((group) => { payload.map((group) => {
group.data.sort((a, b) => lexsort(a, b, (v) => v.label));
Object.values(group.data).map((label) => { Object.values(group.data).map((label) => {
label.data.map((interval) => { label.data.map((interval) => {
interval.timeRange = interval.timeRange.map((t) => new Date(t)); interval.timeRange = interval.timeRange.map((t) => new Date(t));
}) })
}) })
}); });
payload.sort((a, b) => lexsort(a, b, (v) => v.group));
this.data = payload; this.data = payload;
this.chart.data(payload); this.chart.data(payload);
}) })
@@ -54,6 +73,17 @@ export default {
this.update(); this.update();
}, this.refreshSeconds * 1000); }, this.refreshSeconds * 1000);
}, },
setVisibleRange(dateRange) {
if (dateRange === null) {
this.start = MIN_TIME;
this.end = MAX_TIME;
} else {
this.start = dateRange[0].toISOString();
this.end = dateRange[1].toISOString();
}
this.fetchTimeline();
}
}, },
mounted() { mounted() {
@@ -62,6 +92,7 @@ export default {
.zScaleLabel('State') .zScaleLabel('State')
.zQualitative(true) .zQualitative(true)
.useUtc(false) .useUtc(false)
.onZoom((dateRange, _) => this.setVisibleRange(dateRange))
.onSegmentClick((segment) => this.$emit('updateActiveSegment', segment) ); .onSegmentClick((segment) => this.$emit('updateActiveSegment', segment) );
this.update(); this.update();
}, },