aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex <alex@adnab.me>2022-09-06 15:11:30 +0200
committerAlex <alex@adnab.me>2022-09-06 15:11:30 +0200
commited7796924b17ae4e73b21fdd9dfaa0a45bed98ff (patch)
tree73dd84bba384a79cacdbd4bdec01c5c9485d2c6b /src
parent729a910e14bc44925175ea8240d0c16fdfc18103 (diff)
parentea36b9ff904a8300afb8fb1601cde88c915a810f (diff)
downloadgarage-ed7796924b17ae4e73b21fdd9dfaa0a45bed98ff.tar.gz
garage-ed7796924b17ae4e73b21fdd9dfaa0a45bed98ff.zip
Merge pull request 'Make OTLP exporter optional and allow building without Prometheus exporter (/metrics)' (#372) from jirutka/garage:telemetry-and-metrics into improve-deps
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/372 Reviewed-by: Alex <alex@adnab.me>
Diffstat (limited to 'src')
-rw-r--r--src/api/Cargo.toml8
-rw-r--r--src/api/admin/api_server.rs55
-rw-r--r--src/garage/Cargo.toml12
-rw-r--r--src/garage/main.rs1
-rw-r--r--src/garage/server.rs8
5 files changed, 54 insertions, 30 deletions
diff --git a/src/api/Cargo.toml b/src/api/Cargo.toml
index db77cf38..ce2d11c0 100644
--- a/src/api/Cargo.toml
+++ b/src/api/Cargo.toml
@@ -54,9 +54,11 @@ quick-xml = { version = "0.21", features = [ "serialize" ] }
url = "2.1"
opentelemetry = "0.17"
-opentelemetry-prometheus = "0.10"
-opentelemetry-otlp = "0.10"
-prometheus = "0.13"
+opentelemetry-prometheus = { version = "0.10", optional = true }
+opentelemetry-otlp = { version = "0.10", optional = true }
+prometheus = { version = "0.13", optional = true }
[features]
k2v = [ "garage_util/k2v", "garage_model/k2v" ]
+metrics = [ "opentelemetry-prometheus", "prometheus" ]
+telemetry-otlp = ["opentelemetry-otlp"]
diff --git a/src/api/admin/api_server.rs b/src/api/admin/api_server.rs
index c3b16715..d871d4e2 100644
--- a/src/api/admin/api_server.rs
+++ b/src/api/admin/api_server.rs
@@ -3,13 +3,14 @@ use std::sync::Arc;
use async_trait::async_trait;
use futures::future::Future;
-use http::header::{
- ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW, CONTENT_TYPE,
-};
+use http::header::{ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW};
use hyper::{Body, Request, Response};
-use opentelemetry::trace::{SpanRef, Tracer};
+use opentelemetry::trace::SpanRef;
+
+#[cfg(feature = "metrics")]
use opentelemetry_prometheus::PrometheusExporter;
+#[cfg(feature = "metrics")]
use prometheus::{Encoder, TextEncoder};
use garage_model::garage::Garage;
@@ -25,6 +26,7 @@ use crate::admin::router::{Authorization, Endpoint};
pub struct AdminApiServer {
garage: Arc<Garage>,
+ #[cfg(feature = "metrics")]
exporter: PrometheusExporter,
metrics_token: Option<String>,
admin_token: Option<String>,
@@ -32,7 +34,6 @@ pub struct AdminApiServer {
impl AdminApiServer {
pub fn new(garage: Arc<Garage>) -> Self {
- let exporter = opentelemetry_prometheus::exporter().init();
let cfg = &garage.config.admin;
let metrics_token = cfg
.metrics_token
@@ -44,7 +45,8 @@ impl AdminApiServer {
.map(|tok| format!("Bearer {}", tok));
Self {
garage,
- exporter,
+ #[cfg(feature = "metrics")]
+ exporter: opentelemetry_prometheus::exporter().init(),
metrics_token,
admin_token,
}
@@ -71,22 +73,31 @@ impl AdminApiServer {
}
fn handle_metrics(&self) -> Result<Response<Body>, Error> {
- let mut buffer = vec![];
- let encoder = TextEncoder::new();
-
- let tracer = opentelemetry::global::tracer("garage");
- let metric_families = tracer.in_span("admin/gather_metrics", |_| {
- self.exporter.registry().gather()
- });
-
- encoder
- .encode(&metric_families, &mut buffer)
- .ok_or_internal_error("Could not serialize metrics")?;
-
- Ok(Response::builder()
- .status(200)
- .header(CONTENT_TYPE, encoder.format_type())
- .body(Body::from(buffer))?)
+ #[cfg(feature = "metrics")]
+ {
+ use opentelemetry::trace::Tracer;
+
+ let mut buffer = vec![];
+ let encoder = TextEncoder::new();
+
+ let tracer = opentelemetry::global::tracer("garage");
+ let metric_families = tracer.in_span("admin/gather_metrics", |_| {
+ self.exporter.registry().gather()
+ });
+
+ encoder
+ .encode(&metric_families, &mut buffer)
+ .ok_or_internal_error("Could not serialize metrics")?;
+
+ Ok(Response::builder()
+ .status(200)
+ .header(http::header::CONTENT_TYPE, encoder.format_type())
+ .body(Body::from(buffer))?)
+ }
+ #[cfg(not(feature = "metrics"))]
+ Err(Error::bad_request(
+ "Garage was built without the metrics feature".to_string(),
+ ))
}
}
diff --git a/src/garage/Cargo.toml b/src/garage/Cargo.toml
index e19aac50..553ac57a 100644
--- a/src/garage/Cargo.toml
+++ b/src/garage/Cargo.toml
@@ -55,9 +55,9 @@ tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi
netapp = "0.4"
opentelemetry = { version = "0.17", features = [ "rt-tokio" ] }
-opentelemetry-prometheus = "0.10"
-opentelemetry-otlp = "0.10"
-prometheus = "0.13"
+opentelemetry-prometheus = { version = "0.10", optional = true }
+opentelemetry-otlp = { version = "0.10", optional = true }
+prometheus = { version = "0.13", optional = true }
[dev-dependencies]
aws-sdk-s3 = "0.8"
@@ -74,9 +74,13 @@ base64 = "0.13"
[features]
-default = [ "bundled-libs" ]
+default = [ "bundled-libs", "metrics" ]
kubernetes-discovery = [ "garage_rpc/kubernetes-discovery" ]
k2v = [ "garage_util/k2v", "garage_api/k2v" ]
+# Prometheus exporter (/metrics endpoint).
+metrics = [ "garage_api/metrics", "opentelemetry-prometheus", "prometheus" ]
+# Exporter for the OpenTelemetry Collector.
+telemetry-otlp = [ "opentelemetry-otlp", "garage_api/telemetry-otlp" ]
# NOTE: bundled-libs and system-libs should be treat as mutually exclusive;
# exactly one of them should be enabled.
diff --git a/src/garage/main.rs b/src/garage/main.rs
index 89888884..8f0b377e 100644
--- a/src/garage/main.rs
+++ b/src/garage/main.rs
@@ -8,6 +8,7 @@ mod admin;
mod cli;
mod repair;
mod server;
+#[cfg(feature = "telemetry-otlp")]
mod tracing_setup;
use std::net::SocketAddr;
diff --git a/src/garage/server.rs b/src/garage/server.rs
index 6321357a..d328c044 100644
--- a/src/garage/server.rs
+++ b/src/garage/server.rs
@@ -15,6 +15,7 @@ use garage_web::run_web_server;
use garage_api::k2v::api_server::K2VApiServer;
use crate::admin::*;
+#[cfg(feature = "telemetry-otlp")]
use crate::tracing_setup::*;
async fn wait_from(mut chan: watch::Receiver<bool>) {
@@ -36,9 +37,14 @@ pub async fn run_server(config_file: PathBuf) -> Result<(), Error> {
info!("Initializing Garage main data store...");
let garage = Garage::new(config.clone(), background)?;
- info!("Initialize tracing...");
if let Some(export_to) = config.admin.trace_sink {
+ info!("Initialize tracing...");
+
+ #[cfg(feature = "telemetry-otlp")]
init_tracing(&export_to, garage.system.id)?;
+
+ #[cfg(not(feature = "telemetry-otlp"))]
+ warn!("Garage was built without OTLP exporter, admin.trace_sink is ignored.");
}
info!("Initialize Admin API server and metrics collector...");