Skip to content

Commit 51e88f4

Browse files
committed
Add prometheus metrics
1 parent 359dbb9 commit 51e88f4

15 files changed

Lines changed: 392 additions & 28 deletions

Cargo.lock

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,4 @@ tokio = { version = "1.18", features = ["time", "macros", "rt", "rt-multi-thread
5050
walkdir = "2"
5151
futures = "0.3"
5252
pin-project-lite = "0.2.17"
53+
prometheus-client = "0.23"

src/api/build.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ pub async fn review_check(
6363

6464
let check = db.get_check_by_job_id(params.id).await?;
6565
web::block(move || {
66-
let mut conn =
67-
db.0.get()
68-
.map_err(|err| JobError::InternalError(err.to_string()))?;
66+
let mut conn = db
67+
.pool
68+
.get()
69+
.map_err(|err| JobError::InternalError(err.to_string()))?;
6970
update_build_status_after_check(check.build_id, &mut conn)
7071
})
7172
.await

src/api/metrics.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use actix_web::web::Data;
2+
use actix_web::{HttpResponse, Responder};
3+
use std::sync::Arc;
4+
5+
use crate::metrics::Metrics;
6+
7+
pub async fn metrics(metrics: Data<Arc<Metrics>>) -> impl Responder {
8+
HttpResponse::Ok()
9+
.content_type("application/openmetrics-text; version=1.0.0; charset=utf-8")
10+
.body(metrics.encode())
11+
}

src/api/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod build;
2+
pub mod metrics;
23
pub mod prune;
34
pub mod repo;
45
pub mod status;

src/app.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::db::Db;
1616
use crate::deltas::DeltaGenerator;
1717
use crate::jobs::JobQueue;
1818
use crate::logger::Logger;
19+
use crate::metrics::Metrics;
1920
use crate::tokens::TokenParser;
2021
use crate::Pool;
2122

@@ -72,6 +73,7 @@ pub fn create_app(
7273
config: &Arc<Config>,
7374
job_queue: Addr<JobQueue>,
7475
delta_generator: Addr<DeltaGenerator>,
76+
metrics: Arc<Metrics>,
7577
) -> Server {
7678
let c = config.clone();
7779
let secret = config.secret.clone();
@@ -81,14 +83,18 @@ pub fn create_app(
8183
.unwrap_or_else(|| config.secret.as_ref())
8284
.clone();
8385

84-
let db = Db(pool);
86+
let db = Db {
87+
pool,
88+
metrics: Some(metrics.clone()),
89+
};
8590

8691
let http_server = HttpServer::new(move || {
8792
App::new()
8893
.app_data(Data::new(job_queue.clone()))
8994
.app_data(Data::new(delta_generator.clone()))
9095
.app_data(Data::new((*c).clone()))
9196
.app_data(Data::new(db.clone()))
97+
.app_data(Data::new(metrics.clone()))
9298
.wrap(Logger::default())
9399
.wrap(middleware::Compress::default())
94100
.service(
@@ -212,6 +218,7 @@ pub fn create_app(
212218
.route(web::head().to(api::repo::handle_build_repo))
213219
.to(HttpResponse::MethodNotAllowed),
214220
)
221+
.service(web::resource("/metrics").route(web::get().to(api::metrics::metrics)))
215222
.service(web::resource("/status").route(web::get().to(api::status::status)))
216223
.service(web::resource("/status/{id}").route(web::get().to(api::status::job_status)))
217224
});

src/db.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,33 @@ use actix_web::*;
22
use chrono::Utc;
33
use diesel::prelude::*;
44
use serde_json::json;
5+
use std::sync::Arc;
56

67
use crate::errors::ApiError;
8+
use crate::metrics::{kind_label, repo_label, JobLabels, Metrics};
79
use crate::models::*;
810
use crate::schema;
911
use crate::Pool;
1012

1113
#[derive(Clone)]
12-
pub struct Db(pub Pool);
14+
pub struct Db {
15+
pub pool: Pool,
16+
pub metrics: Option<Arc<Metrics>>,
17+
}
1318

1419
impl Db {
20+
fn increment_queued_job_metric(&self, job: &Job) {
21+
if let Some(metrics) = &self.metrics {
22+
metrics
23+
.jobs_queued
24+
.get_or_create(&JobLabels {
25+
kind: kind_label(job.kind),
26+
repo: repo_label(&job.repo),
27+
})
28+
.inc();
29+
}
30+
}
31+
1532
async fn run<Func, T>(&self, func: Func) -> Result<T, ApiError>
1633
where
1734
Func: FnOnce(
@@ -20,7 +37,7 @@ impl Db {
2037
Func: Send + 'static,
2138
T: Send + 'static,
2239
{
23-
let p = self.0.clone();
40+
let p = self.pool.clone();
2441
web::block(move || {
2542
let mut conn = p.get()?;
2643
func(&mut conn)
@@ -139,6 +156,10 @@ impl Db {
139156
Ok(job)
140157
})
141158
.await
159+
.map(|job| {
160+
self.increment_queued_job_metric(&job);
161+
job
162+
})
142163
}
143164

144165
pub async fn start_publish_job(&self, build_id: i32, repo: String) -> Result<Job, ApiError> {
@@ -237,6 +258,10 @@ impl Db {
237258
Ok(job)
238259
})
239260
.await
261+
.map(|job| {
262+
self.increment_queued_job_metric(&job);
263+
job
264+
})
240265
}
241266

242267
pub async fn start_republish_job(
@@ -264,6 +289,10 @@ impl Db {
264289
Ok(job)
265290
})
266291
.await
292+
.map(|job| {
293+
self.increment_queued_job_metric(&job);
294+
job
295+
})
267296
}
268297

269298
pub async fn start_prune_job(&self, repo: String) -> Result<Job, ApiError> {
@@ -279,6 +308,10 @@ impl Db {
279308
.map_err(ApiError::from)
280309
})
281310
.await
311+
.map(|job| {
312+
self.increment_queued_job_metric(&job);
313+
job
314+
})
282315
}
283316

284317
/* Checks */

src/jobs/commit_job.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use std::str;
1111

1212
use crate::config::{Config, RepoConfig};
1313
use crate::errors::{JobError, JobResult};
14+
use crate::metrics::{kind_label, repo_label, JobLabels};
1415
use crate::models::{
1516
self, Check, CheckJob, CheckStatus, CommitJob, Job, JobKind, NewJob, RepoState,
1617
};
@@ -231,6 +232,17 @@ impl JobInstance for CommitJobInstance {
231232
)
232233
.get_results::<Job>(conn)?;
233234

235+
for job in &check_jobs {
236+
executor
237+
.metrics
238+
.jobs_queued
239+
.get_or_create(&JobLabels {
240+
kind: kind_label(job.kind),
241+
repo: repo_label(&job.repo),
242+
})
243+
.inc();
244+
}
245+
234246
// Create a check row for each new check job. This row ties the job to the build and records its status.
235247
let (pending_status, pending_status_msg) = CheckStatus::Pending.to_db();
236248
let checks = repoconfig

0 commit comments

Comments
 (0)