Skip to content

Commit 9cb81df

Browse files
committed
create a tracing span while processing a log
1 parent 5601bcc commit 9cb81df

File tree

3 files changed

+64
-45
lines changed

3 files changed

+64
-45
lines changed

src/bin/server/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ pub use self::worker::Worker;
66
mod service;
77
mod worker;
88

9-
pub enum QueueItem {
9+
pub struct QueueItem {
10+
pub kind: QueueItemKind,
11+
pub delivery_id: String,
12+
}
13+
14+
pub enum QueueItemKind {
1015
GitHubStatus(rla::github::CommitStatusEvent),
1116
GitHubCheckRun(rla::github::CheckRunEvent),
1217
}

src/bin/server/service.rs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::QueueItem;
1+
use super::{QueueItem, QueueItemKind};
22

33
use crate::rla;
44
use futures::{future, Future, Stream};
@@ -68,7 +68,17 @@ impl RlaService {
6868
}
6969
};
7070

71-
match event {
71+
let delivery_header = headers
72+
.get("X-GitHub-Delivery")
73+
.and_then(|s| s.to_str().ok())
74+
.map(|s| s.to_string());
75+
let delivery_id = if let Some(id) = delivery_header {
76+
id
77+
} else {
78+
return reply(StatusCode::BAD_REQUEST, "Missing delivery ID.\n");
79+
};
80+
81+
let item_kind = match event {
7282
"status" => {
7383
let payload = match serde_json::from_slice(body) {
7484
Ok(p) => p,
@@ -77,17 +87,7 @@ impl RlaService {
7787
return reply(StatusCode::BAD_REQUEST, "Failed to decode payload.\n");
7888
}
7989
};
80-
81-
match self.queue.send(QueueItem::GitHubStatus(payload)) {
82-
Ok(()) => reply(StatusCode::OK, "Event processed.\n"),
83-
Err(e) => {
84-
error!("Failed to queue payload: {}", e);
85-
reply(
86-
StatusCode::INTERNAL_SERVER_ERROR,
87-
"Failed to process the event.\n",
88-
)
89-
}
90-
}
90+
QueueItemKind::GitHubStatus(payload)
9191
}
9292
"check_run" => {
9393
let payload = match serde_json::from_slice(body) {
@@ -98,24 +98,30 @@ impl RlaService {
9898
}
9999
};
100100

101-
match self.queue.send(QueueItem::GitHubCheckRun(payload)) {
102-
Ok(()) => reply(StatusCode::OK, "Event processed.\n"),
103-
Err(e) => {
104-
error!("Failed to queue payload: {}", e);
105-
reply(
106-
StatusCode::INTERNAL_SERVER_ERROR,
107-
"Failed to process the event.\n",
108-
)
109-
}
110-
}
101+
QueueItemKind::GitHubCheckRun(payload)
111102
}
112103
"issue_comment" => {
113104
debug!("Ignoring 'issue_comment' event.");
114-
reply(StatusCode::OK, "Event ignored.\n")
105+
return reply(StatusCode::OK, "Event ignored.\n");
115106
}
116107
_ => {
117108
warn!("Unexpected '{}' event.", event);
118-
reply(StatusCode::BAD_REQUEST, "Unexpected event.\n")
109+
return reply(StatusCode::BAD_REQUEST, "Unexpected event.\n");
110+
}
111+
};
112+
113+
let item = QueueItem {
114+
kind: item_kind,
115+
delivery_id,
116+
};
117+
match self.queue.send(item) {
118+
Ok(()) => reply(StatusCode::OK, "Event processed.\n"),
119+
Err(e) => {
120+
error!("Failed to queue payload: {}", e);
121+
reply(
122+
StatusCode::INTERNAL_SERVER_ERROR,
123+
"Failed to process the event.\n",
124+
)
119125
}
120126
}
121127
}

src/bin/server/worker.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::QueueItem;
1+
use super::{QueueItem, QueueItemKind};
22

33
use crate::rla;
44
use crate::rla::ci::{self, BuildCommit, CiPlatform};
@@ -78,7 +78,16 @@ impl Worker {
7878
pub fn main(&mut self) -> rla::Result<()> {
7979
loop {
8080
let item = self.queue.recv()?;
81-
match self.process(item) {
81+
82+
let span = span!(
83+
tracing::Level::INFO,
84+
"request",
85+
delivery = item.delivery_id.as_str(),
86+
build_id = tracing::field::Empty
87+
);
88+
let _enter = span.enter();
89+
90+
match self.process(item, &span) {
8291
Ok(()) => (),
8392
Err(e) => error!("Processing queue item failed: {}", e),
8493
}
@@ -92,9 +101,9 @@ impl Worker {
92101
self.secondary_repos.iter().find(|r| *r == repo).is_some()
93102
}
94103

95-
fn process(&mut self, item: QueueItem) -> rla::Result<()> {
96-
let (repo, build_id, outcome) = match &item {
97-
QueueItem::GitHubStatus(ev) => match self.ci.build_id_from_github_status(&ev) {
104+
fn process(&mut self, item: QueueItem, span: &tracing::Span) -> rla::Result<()> {
105+
let (repo, build_id, outcome) = match &item.kind {
106+
QueueItemKind::GitHubStatus(ev) => match self.ci.build_id_from_github_status(&ev) {
98107
Some(id) if self.is_repo_valid(&ev.repository.full_name) => {
99108
(&ev.repository.full_name, id, None)
100109
}
@@ -106,7 +115,7 @@ impl Worker {
106115
return Ok(());
107116
}
108117
},
109-
QueueItem::GitHubCheckRun(ev) => match self.ci.build_id_from_github_check(&ev) {
118+
QueueItemKind::GitHubCheckRun(ev) => match self.ci.build_id_from_github_check(&ev) {
110119
Some(id) if self.is_repo_valid(&ev.repository.full_name) => {
111120
(&ev.repository.full_name, id, Some(&ev.check_run.outcome))
112121
}
@@ -120,10 +129,12 @@ impl Worker {
120129
},
121130
};
122131

123-
info!("build {}: started processing", build_id);
132+
span.record("build_id", &build_id);
133+
134+
info!("started processing");
124135

125136
if self.seen.contains(&build_id) {
126-
info!("build {}: ignoring recently seen id", build_id);
137+
info!("ignoring recently seen id");
127138
return Ok(());
128139
}
129140
let query_from = if self.query_builds_from_primary_repo {
@@ -138,34 +149,31 @@ impl Worker {
138149
_ => build.outcome(),
139150
};
140151

141-
debug!("build {}: current outcome: {:?}", build_id, outcome);
142-
debug!("build {}: PR number: {:?}", build_id, build.pr_number());
143-
debug!("build {}: branch name: {:?}", build_id, build.branch_name());
152+
debug!("current outcome: {:?}", outcome);
153+
debug!("PR number: {:?}", build.pr_number());
154+
debug!("branch name: {:?}", build.branch_name());
144155

145156
if !outcome.is_finished() {
146-
info!("build {}: ignoring in-progress build", build_id);
157+
info!("ignoring in-progress build");
147158
return Ok(());
148159
}
149160

150161
// Avoid processing the same build multiple times.
151-
info!("build {}: marked as seen", build_id);
162+
info!("marked as seen");
152163
self.seen.push_front(build_id);
153164
if self.seen.len() > KEEP_IDS {
154165
self.seen.pop_back();
155166
}
156167

157168
if !outcome.is_passed() {
158-
info!("build {}: preparing report", build_id);
169+
info!("preparing report");
159170
self.report_failed(build.as_ref())?;
160171
}
161172
if build.pr_number().is_none() && build.branch_name() == "auto" {
162-
info!("build {}: learning from the log", build_id);
173+
info!("learning from the log");
163174
self.learn(build.as_ref())?;
164175
} else {
165-
info!(
166-
"build {}: did not learn as it's not an auto build",
167-
build_id
168-
);
176+
info!("did not learn as it's not an auto build");
169177
}
170178

171179
Ok(())

0 commit comments

Comments
 (0)