Add rendering hint to snap y axis
This commit is contained in:
parent
9cc141e227
commit
badfae12e7
|
@ -21,6 +21,8 @@ pub struct GraphConfig {
|
||||||
pub kind: MetricKind,
|
pub kind: MetricKind,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub transform: Option<MetricTransform>,
|
pub transform: Option<MetricTransform>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub rendering: GraphRenderingHints,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Hash, Eq, PartialEq)]
|
#[derive(Clone, Debug, Hash, Eq, PartialEq)]
|
||||||
|
@ -29,3 +31,9 @@ pub struct GraphRequest {
|
||||||
pub metric_labels: BTreeMap<String, String>,
|
pub metric_labels: BTreeMap<String, String>,
|
||||||
pub derivation: Option<MetricTransform>,
|
pub derivation: Option<MetricTransform>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Default, Deserialize)]
|
||||||
|
pub struct GraphRenderingHints {
|
||||||
|
/// The view will be forced to include this range.
|
||||||
|
pub include_y_range: Option<(f64, f64)>,
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::background_loader::MetricsLogReadingRequester;
|
use crate::background_loader::MetricsLogReadingRequester;
|
||||||
use crate::config::GraphRequest;
|
use crate::config::{GraphRenderingHints, GraphRequest};
|
||||||
use bare_metrics_core::structures::UnixTimestampMilliseconds;
|
use bare_metrics_core::structures::UnixTimestampMilliseconds;
|
||||||
use eframe::egui::{
|
use eframe::egui::{
|
||||||
Color32, Frame as EguiFrame, PointerButton, Pos2, Rect, Sense, Stroke, TextStyle, Ui, Vec2,
|
Color32, Frame as EguiFrame, PointerButton, Pos2, Rect, Sense, Stroke, TextStyle, Ui, Vec2,
|
||||||
|
@ -64,7 +64,12 @@ impl Mul<(f64, f64)> for GraphTransform {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Graph {
|
impl Graph {
|
||||||
pub fn draw(ui: &mut Ui, graph_request: &GraphRequest, reader: &MetricsLogReadingRequester) {
|
pub fn draw(
|
||||||
|
ui: &mut Ui,
|
||||||
|
graph_request: &GraphRequest,
|
||||||
|
render_hint: &GraphRenderingHints,
|
||||||
|
reader: &MetricsLogReadingRequester,
|
||||||
|
) {
|
||||||
let context_menu_id = ui.id().with("context menu");
|
let context_menu_id = ui.id().with("context menu");
|
||||||
|
|
||||||
EguiFrame::dark_canvas(ui.style()).show(ui, |ui| {
|
EguiFrame::dark_canvas(ui.style()).show(ui, |ui| {
|
||||||
|
@ -101,13 +106,25 @@ impl Graph {
|
||||||
|
|
||||||
// This range is reversed because screen coordinates go down, but we'd like them to go
|
// This range is reversed because screen coordinates go down, but we'd like them to go
|
||||||
// up since this is more of a mathematical graph.
|
// up since this is more of a mathematical graph.
|
||||||
let y_axis = if let Some(histogram) = current_window.histograms.get(graph_request) {
|
let mut y_axis = if let Some(histogram) = current_window.histograms.get(graph_request) {
|
||||||
histogram.y_axis.clone().into_inner()
|
histogram.y_axis.clone().into_inner()
|
||||||
} else if let Some(scalar) = current_window.scalars.get(graph_request) {
|
} else if let Some(scalar) = current_window.scalars.get(graph_request) {
|
||||||
scalar.y_axis.clone().into_inner()
|
scalar.y_axis.clone().into_inner()
|
||||||
} else {
|
} else {
|
||||||
(0.0, 10.0)
|
(0.0, 10.0)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some((a, b)) = render_hint.include_y_range {
|
||||||
|
// Force the y-axis to contain a range. Useful if you like 0 to be anchored on a
|
||||||
|
// rate graph or something like that.
|
||||||
|
if y_axis.0 > a {
|
||||||
|
y_axis.0 = a;
|
||||||
|
}
|
||||||
|
if y_axis.1 < b {
|
||||||
|
y_axis.1 = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let y_axis = (y_axis.1)..=(y_axis.0);
|
let y_axis = (y_axis.1)..=(y_axis.0);
|
||||||
|
|
||||||
// let display_transform =
|
// let display_transform =
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::background_loader::{
|
use crate::background_loader::{
|
||||||
MetricsLogReaderMessage, MetricsLogReaderNotification, MetricsLogReadingRequester,
|
MetricsLogReaderMessage, MetricsLogReaderNotification, MetricsLogReadingRequester,
|
||||||
};
|
};
|
||||||
use crate::config::{DashboardConfig, GraphRequest};
|
use crate::config::{DashboardConfig, GraphRenderingHints, GraphRequest};
|
||||||
use crate::graph::Graph;
|
use crate::graph::Graph;
|
||||||
|
|
||||||
use bare_metrics_reader::MetricsLogReader;
|
use bare_metrics_reader::MetricsLogReader;
|
||||||
|
@ -23,7 +23,8 @@ pub struct MetricsGui {
|
||||||
requester: MetricsLogReadingRequester,
|
requester: MetricsLogReadingRequester,
|
||||||
|
|
||||||
dashboard: Option<DashboardConfig>,
|
dashboard: Option<DashboardConfig>,
|
||||||
graph_requests: Vec<GraphRequest>,
|
// TODO we may want multiple graphs on the same pane, somehow.
|
||||||
|
graph_requests: Vec<(GraphRequest, GraphRenderingHints)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App for MetricsGui {
|
impl App for MetricsGui {
|
||||||
|
@ -39,13 +40,13 @@ impl App for MetricsGui {
|
||||||
egui::ScrollArea::new([false, true]).show(ui, |ui| {
|
egui::ScrollArea::new([false, true]).show(ui, |ui| {
|
||||||
if let Some(_dashboard) = dashboard {
|
if let Some(_dashboard) = dashboard {
|
||||||
let window = requester.shared.current_window.read().unwrap();
|
let window = requester.shared.current_window.read().unwrap();
|
||||||
for graph in graph_requests.iter() {
|
for (request, render_hint) in graph_requests.iter() {
|
||||||
ui.label(&graph.metric_name);
|
ui.label(&request.metric_name);
|
||||||
|
|
||||||
if window.scalars.contains_key(graph)
|
if window.scalars.contains_key(request)
|
||||||
|| window.histograms.contains_key(graph)
|
|| window.histograms.contains_key(request)
|
||||||
{
|
{
|
||||||
Graph::draw(ui, graph, requester);
|
Graph::draw(ui, request, render_hint, requester);
|
||||||
} else {
|
} else {
|
||||||
// TODO clarify
|
// TODO clarify
|
||||||
ui.label("(loading or missing ...)");
|
ui.label("(loading or missing ...)");
|
||||||
|
@ -104,12 +105,15 @@ impl MetricsGui {
|
||||||
if let Some(dashboard) = self.dashboard.as_ref() {
|
if let Some(dashboard) = self.dashboard.as_ref() {
|
||||||
for graph in dashboard.graphs.iter() {
|
for graph in dashboard.graphs.iter() {
|
||||||
// TODO frankly we should maybe be using metric IDs in the graph requests
|
// TODO frankly we should maybe be using metric IDs in the graph requests
|
||||||
self.graph_requests.push(GraphRequest {
|
self.graph_requests.push((
|
||||||
|
GraphRequest {
|
||||||
metric_name: graph.name.clone(),
|
metric_name: graph.name.clone(),
|
||||||
// TODO we need something better about the metric labels
|
// TODO we need something better about the metric labels
|
||||||
metric_labels: BTreeMap::new(),
|
metric_labels: BTreeMap::new(),
|
||||||
derivation: graph.transform.clone(),
|
derivation: graph.transform.clone(),
|
||||||
});
|
},
|
||||||
|
graph.rendering.clone(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO Build some stuff automatically based on alphabetical ordering
|
// TODO Build some stuff automatically based on alphabetical ordering
|
||||||
|
@ -120,7 +124,12 @@ impl MetricsGui {
|
||||||
.send(MetricsLogReaderMessage::LoadNewWindow {
|
.send(MetricsLogReaderMessage::LoadNewWindow {
|
||||||
new_time_range: f64::NEG_INFINITY..=f64::INFINITY,
|
new_time_range: f64::NEG_INFINITY..=f64::INFINITY,
|
||||||
new_wanted_time_points: 512,
|
new_wanted_time_points: 512,
|
||||||
requests: self.graph_requests.clone(),
|
requests: self
|
||||||
|
.graph_requests
|
||||||
|
.iter()
|
||||||
|
.map(|(a, _)| a)
|
||||||
|
.cloned()
|
||||||
|
.collect(),
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue