Skip to content

Commit 7eea540

Browse files
authored
ref(system): Only return metrics for alive services (#4526)
Only return metrics for services which have not terminated. Also cleans up the `start_in` method a bit, the variable naming was pretty bad and the instance id allocation/tracking can be moved to the group, making the `start_in` much easier to understand.
1 parent ca911ea commit 7eea540

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

relay-system/src/service/registry.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -104,38 +104,24 @@ impl Inner {
104104
let task_id = TaskId::from(&service);
105105
let group = self.services.entry(task_id).or_default();
106106

107-
// Cleanup group, evicting all terminated services, while we're at it.
108-
group.instances.retain(|s| !s.handle.is_finished());
109-
110-
let id = ServiceId {
111-
task: task_id,
112-
instance_id: group.next_instance_id,
113-
};
114-
group.next_instance_id += 1;
115-
116107
// Services are allowed to process as much work as possible before yielding to other,
117108
// lower priority tasks. We want to prioritize service backlogs over creating more work
118109
// for these services.
119110
let future = tokio::task::unconstrained(service.future);
120111
let future = ServiceMonitor::wrap(future);
121112
let metrics = Arc::clone(future.metrics());
122113

123-
let jh = crate::runtime::spawn_in(handle, task_id, future);
124-
let (sjh, sjhe) = crate::service::status::split(jh);
114+
let task_handle = crate::runtime::spawn_in(handle, task_id, future);
115+
let (status_handle, handle) = crate::service::status::split(task_handle);
125116

126-
let service = ServiceInstance {
127-
instance_id: id.instance_id,
128-
metrics,
129-
handle: sjh,
130-
};
131-
group.instances.push(service);
117+
group.add(metrics, status_handle);
132118

133-
sjhe
119+
handle
134120
}
135121

136122
fn metrics(&self) -> impl Iterator<Item = (ServiceId, ServiceMetrics)> + '_ {
137123
self.services.iter().flat_map(|(task_id, group)| {
138-
group.instances.iter().map(|service| {
124+
group.iter().map(|service| {
139125
let id = ServiceId {
140126
task: *task_id,
141127
instance_id: service.instance_id,
@@ -176,6 +162,30 @@ struct ServiceGroup {
176162
instances: Vec<ServiceInstance>,
177163
}
178164

165+
impl ServiceGroup {
166+
/// Adds a started service to the service group.
167+
pub fn add(&mut self, metrics: Arc<RawMetrics>, handle: ServiceStatusJoinHandle) {
168+
// Cleanup the group, evicting all finished services, while we're at it.
169+
self.instances.retain(|s| !s.handle.is_finished());
170+
171+
let instance_id = self.next_instance_id;
172+
self.next_instance_id += 1;
173+
174+
let service = ServiceInstance {
175+
instance_id,
176+
metrics,
177+
handle,
178+
};
179+
180+
self.instances.push(service);
181+
}
182+
183+
/// Returns an iterator over all currently alive services.
184+
pub fn iter(&self) -> impl Iterator<Item = &ServiceInstance> {
185+
self.instances.iter().filter(|s| !s.handle.is_finished())
186+
}
187+
}
188+
179189
/// Collection of metadata the registry tracks per service instance.
180190
#[derive(Debug)]
181191
struct ServiceInstance {

0 commit comments

Comments
 (0)