Skip to content

Commit 9511510

Browse files
committed
extract opentelemetry logic into subcrate
1 parent 4452c31 commit 9511510

File tree

18 files changed

+105
-51
lines changed

18 files changed

+105
-51
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@ exclude = [
2222

2323
[workspace.dependencies]
2424
anyhow = { version = "1.0.42", features = ["backtrace"]}
25+
derive_more = { version = "2.0.0", features = ["display", "deref", "from", "into", "from_str"] }
26+
opentelemetry = "0.31.0"
27+
opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic", "metrics"] }
28+
opentelemetry-resource-detectors = "0.10.0"
29+
opentelemetry_sdk = { version = "0.31.0", features = ["rt-tokio"] }
2530
tracing = "0.1.37"
31+
url = { version = "2.1.1", features = ["serde"] }
2632

2733
[dependencies]
2834
docs_rs_env_vars = { path = "crates/lib/docs_rs_env_vars" }
35+
docs_rs_opentelemetry = { path = "crates/lib/docs_rs_opentelemetry" }
2936
sentry = { version = "0.46.0", features = ["panic", "tracing", "tower-http", "anyhow", "backtrace"] }
3037
log = "0.4"
3138
tracing = { workspace = true }
@@ -41,17 +48,15 @@ reqwest = { version = "0.12", features = ["json", "gzip"] }
4148
semver = { version = "1.0.4", features = ["serde"] }
4249
slug = "0.1.1"
4350
sqlx = { version = "0.8", features = [ "runtime-tokio", "postgres", "sqlite", "chrono" ] }
44-
url = { version = "2.1.1", features = ["serde"] }
51+
url = { workspace = true }
4552
docsrs-metadata = { path = "crates/lib/metadata" }
4653
anyhow = { workspace = true }
4754
thiserror = "2.0.3"
4855
comrak = { version = "0.49.0", default-features = false }
4956
syntect = { version = "5.0.0", default-features = false, features = ["parsing", "html", "dump-load", "regex-onig"] }
5057
toml = "0.9.2"
51-
opentelemetry = "0.31.0"
52-
opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic", "metrics"] }
53-
opentelemetry-resource-detectors = "0.10.0"
54-
opentelemetry_sdk = { version = "0.31.0", features = ["rt-tokio"] }
58+
opentelemetry = { workspace = true }
59+
opentelemetry_sdk = { workspace = true }
5560
rustwide = { version = "0.21.0", features = ["unstable-toolchain-ci", "unstable"] }
5661
mime_guess = "2"
5762
zstd = "0.13.0"
@@ -68,7 +73,7 @@ bzip2 = "0.6.0"
6873
getrandom = "0.3.1"
6974
itertools = { version = "0.14.0" }
7075
hex = "0.4.3"
71-
derive_more = { version = "2.0.0", features = ["display", "deref", "from", "into", "from_str"] }
76+
derive_more = { workspace = true }
7277
sysinfo = { version = "0.37.2", default-features = false, features = ["system"] }
7378
derive_builder = "0.20.2"
7479

@@ -117,6 +122,7 @@ md5 = "0.8.0"
117122
crates_io_validation = { path = "crates/lib/crates_io_validation" }
118123

119124
[dev-dependencies]
125+
docs_rs_opentelemetry = { path = "crates/lib/docs_rs_opentelemetry", features = ["testing"] }
120126
criterion = "0.8.0"
121127
kuchikiki = "0.8"
122128
http-body-util = "0.1.0"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "docs_rs_opentelemetry"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
anyhow = { workspace = true }
8+
derive_more = { workspace = true, optional = true }
9+
docs_rs_env_vars = { path = "../docs_rs_env_vars" }
10+
opentelemetry = { workspace = true }
11+
opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic", "metrics"] }
12+
opentelemetry-resource-detectors = "0.10.0"
13+
opentelemetry_sdk = { workspace = true }
14+
tracing = { workspace = true }
15+
url = { workspace = true }
16+
17+
[features]
18+
testing = ["dep:derive_more"]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use docs_rs_env_vars::maybe_env;
2+
use url::Url;
3+
4+
#[derive(Debug)]
5+
pub struct Config {
6+
// opentelemetry endpoint to send OTLP to
7+
pub endpoint: Option<Url>,
8+
}
9+
10+
impl Config {
11+
pub fn from_environment() -> anyhow::Result<Self> {
12+
Ok(Self {
13+
endpoint: maybe_env("OTEL_EXPORTER_OTLP_ENDPOINT")?,
14+
})
15+
}
16+
}

src/metrics/otel.rs renamed to crates/lib/docs_rs_opentelemetry/src/lib.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use crate::Config;
1+
mod config;
2+
#[cfg(feature = "testing")]
3+
pub mod testing;
4+
pub use config::Config;
5+
26
use anyhow::Result;
37
use opentelemetry::{
48
InstrumentationScope,
@@ -26,8 +30,8 @@ impl MeterProviderWithExt for opentelemetry_sdk::metrics::SdkMeterProvider {
2630

2731
/// opentelemetry metric provider setup,
2832
/// if no endpoint is configured, use a no-op provider
29-
pub(crate) fn get_meter_provider(config: &Config) -> Result<AnyMeterProvider> {
30-
if let Some(ref endpoint) = config.opentelemetry_endpoint {
33+
pub fn get_meter_provider(config: &config::Config) -> Result<AnyMeterProvider> {
34+
if let Some(ref endpoint) = config.endpoint {
3135
let endpoint = endpoint.to_string();
3236
info!(endpoint, "setting up OpenTelemetry metrics exporter");
3337

@@ -61,7 +65,7 @@ pub(crate) fn get_meter_provider(config: &Config) -> Result<AnyMeterProvider> {
6165
/// For now, copy/paste from opentelemetry-sdk, see
6266
/// https://github.com/open-telemetry/opentelemetry-rust/pull/3111
6367
#[derive(Debug, Default)]
64-
pub(crate) struct NoopMeterProvider {
68+
pub struct NoopMeterProvider {
6569
_private: (),
6670
}
6771

@@ -86,13 +90,13 @@ impl MeterProviderWithExt for NoopMeterProvider {
8690

8791
/// A no-op instance of a `Meter`
8892
#[derive(Debug, Default)]
89-
pub(crate) struct NoopMeter {
93+
pub struct NoopMeter {
9094
_private: (),
9195
}
9296

9397
impl NoopMeter {
9498
/// Create a new no-op meter core.
95-
pub(crate) fn new() -> Self {
99+
pub fn new() -> Self {
96100
NoopMeter { _private: () }
97101
}
98102
}

src/test/test_metrics.rs renamed to crates/lib/docs_rs_opentelemetry/src/testing.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::sync::Arc;
22

3+
use crate::AnyMeterProvider;
34
use anyhow::{Result, anyhow};
45
use derive_more::Deref;
56
use opentelemetry_sdk::metrics::{
@@ -9,11 +10,9 @@ use opentelemetry_sdk::metrics::{
910
},
1011
};
1112

12-
use crate::metrics::otel::AnyMeterProvider;
13-
1413
/// set up a standalone InMemoryMetricExporter and MeterProvider for testing purposes.
1514
/// For when you want to collect metrics, and then inspect what was collected.
16-
pub(crate) fn setup_test_meter_provider() -> (InMemoryMetricExporter, AnyMeterProvider) {
15+
pub fn setup_test_meter_provider() -> (InMemoryMetricExporter, AnyMeterProvider) {
1716
let metric_exporter = InMemoryMetricExporter::default();
1817

1918
(
@@ -29,10 +28,10 @@ pub(crate) fn setup_test_meter_provider() -> (InMemoryMetricExporter, AnyMeterPr
2928
/// small wrapper around the collected result of the InMemoryMetricExporter.
3029
/// For convenience in tests.
3130
#[derive(Debug)]
32-
pub(crate) struct CollectedMetrics(pub(crate) Vec<ResourceMetrics>);
31+
pub struct CollectedMetrics(pub Vec<ResourceMetrics>);
3332

3433
impl CollectedMetrics {
35-
pub(crate) fn get_metric<'a>(
34+
pub fn get_metric<'a>(
3635
&'a self,
3736
scope: impl AsRef<str>,
3837
name: impl AsRef<str>,
@@ -70,10 +69,10 @@ impl CollectedMetrics {
7069
}
7170

7271
#[derive(Debug, Deref)]
73-
pub(crate) struct CollectedMetric<'a>(&'a Metric);
72+
pub struct CollectedMetric<'a>(&'a Metric);
7473

7574
impl<'a> CollectedMetric<'a> {
76-
pub(crate) fn get_u64_counter(&'a self) -> &'a SumDataPoint<u64> {
75+
pub fn get_u64_counter(&'a self) -> &'a SumDataPoint<u64> {
7776
let AggregatedMetrics::U64(metric_data) = self.data() else {
7877
panic!("Expected U64 metric data, got: {:?}", self.data());
7978
};
@@ -93,7 +92,7 @@ impl<'a> CollectedMetric<'a> {
9392
result
9493
}
9594

96-
pub(crate) fn get_f64_histogram(&'a self) -> &'a HistogramDataPoint<f64> {
95+
pub fn get_f64_histogram(&'a self) -> &'a HistogramDataPoint<f64> {
9796
let AggregatedMetrics::F64(metric_data) = self.data() else {
9897
panic!("Expected F64 metric data, got: {:?}", self.data());
9998
};

src/build_queue.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ use crate::{
99
},
1010
docbuilder::{BuilderMetrics, PackageKind},
1111
error::Result,
12-
metrics::otel::AnyMeterProvider,
1312
storage::AsyncStorage,
1413
utils::{ConfigName, get_config, get_crate_priority, report_error, retry, set_config},
1514
};
1615
use anyhow::Context as _;
1716
use chrono::NaiveDate;
1817
use crates_index_diff::{Change, CrateVersion};
18+
use docs_rs_opentelemetry::AnyMeterProvider;
1919
use fn_error_context::context;
2020
use futures_util::{StreamExt, stream::TryStreamExt};
2121
use opentelemetry::metrics::Counter;

src/cdn/fastly.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,9 @@ where
175175
#[cfg(test)]
176176
mod tests {
177177
use super::*;
178-
use crate::test::{TestEnvironment, setup_test_meter_provider};
178+
use crate::test::TestEnvironment;
179179
use chrono::TimeZone;
180+
use docs_rs_opentelemetry::testing::setup_test_meter_provider;
180181
use std::str::FromStr as _;
181182

182183
#[test]

src/cdn/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
use crate::{
2-
Config, db::types::krate_name::KrateName, metrics::otel::AnyMeterProvider,
3-
web::headers::SurrogateKey,
4-
};
1+
use crate::{Config, db::types::krate_name::KrateName, web::headers::SurrogateKey};
52
use anyhow::Result;
3+
use docs_rs_opentelemetry::AnyMeterProvider;
64
use opentelemetry::metrics::{Counter, Gauge};
75
use tracing::{error, info, instrument};
86

src/config.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ pub struct Config {
142142
// automatic rebuild configuration
143143
pub(crate) max_queued_rebuilds: Option<u16>,
144144

145-
// opentelemetry endpoint to send OTLP to
146-
pub(crate) opentelemetry_endpoint: Option<Url>,
145+
pub(crate) opentelemetry: docs_rs_opentelemetry::Config,
147146
}
148147

149148
impl Config {
@@ -187,7 +186,6 @@ impl Config {
187186
"DOCSRS_REGISTRY_API_HOST",
188187
"https://crates.io".parse().unwrap(),
189188
)?)
190-
.opentelemetry_endpoint(maybe_env("OTEL_EXPORTER_OTLP_ENDPOINT")?)
191189
.prefix(prefix.clone())
192190
.database_url(require_env("DOCSRS_DATABASE_URL")?)
193191
.max_pool_size(env("DOCSRS_MAX_POOL_SIZE", 90u32)?)
@@ -248,7 +246,8 @@ impl Config {
248246
"DOCSRS_BUILD_WORKSPACE_REINITIALIZATION_INTERVAL",
249247
86400,
250248
)?))
251-
.max_queued_rebuilds(maybe_env("DOCSRS_MAX_QUEUED_REBUILDS")?))
249+
.max_queued_rebuilds(maybe_env("DOCSRS_MAX_QUEUED_REBUILDS")?)
250+
.opentelemetry(docs_rs_opentelemetry::Config::from_environment()?))
252251
}
253252

254253
pub fn max_file_size_for(&self, path: impl AsRef<Path>) -> usize {

0 commit comments

Comments
 (0)