This commit is contained in:
2024-04-28 18:00:55 +02:00
parent 3fe3e5036d
commit 5f590b72fb
6 changed files with 215 additions and 106 deletions

72
Cargo.lock generated
View File

@@ -424,7 +424,7 @@ dependencies = [
"futures-core",
"prost",
"prost-types",
"tonic",
"tonic 0.10.2",
"tracing-core",
]
@@ -446,7 +446,7 @@ dependencies = [
"thread_local",
"tokio",
"tokio-stream",
"tonic",
"tonic 0.10.2",
"tracing",
"tracing-core",
"tracing-subscriber",
@@ -1429,6 +1429,43 @@ dependencies = [
"urlencoding",
]
[[package]]
name = "opentelemetry-otlp"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb"
dependencies = [
"async-trait",
"futures-core",
"http 0.2.12",
"opentelemetry",
"opentelemetry-proto",
"opentelemetry-semantic-conventions",
"opentelemetry_sdk",
"prost",
"thiserror",
"tokio",
"tonic 0.11.0",
]
[[package]]
name = "opentelemetry-proto"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4"
dependencies = [
"opentelemetry",
"opentelemetry_sdk",
"prost",
"tonic 0.11.0",
]
[[package]]
name = "opentelemetry-semantic-conventions"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910"
[[package]]
name = "opentelemetry_sdk"
version = "0.22.1"
@@ -1447,6 +1484,8 @@ dependencies = [
"percent-encoding",
"rand",
"thiserror",
"tokio",
"tokio-stream",
]
[[package]]
@@ -1481,6 +1520,7 @@ dependencies = [
"maud",
"metrics",
"opentelemetry",
"opentelemetry-otlp",
"opentelemetry_sdk",
"serde",
"serde_variant",
@@ -1488,6 +1528,7 @@ dependencies = [
"sqlx",
"time",
"tokio",
"tonic 0.11.0",
"tower",
"tower-http",
"tracing",
@@ -2527,6 +2568,33 @@ dependencies = [
"tracing",
]
[[package]]
name = "tonic"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13"
dependencies = [
"async-stream",
"async-trait",
"axum 0.6.20",
"base64 0.21.7",
"bytes",
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
"hyper 0.14.28",
"hyper-timeout",
"percent-encoding",
"pin-project",
"prost",
"tokio",
"tokio-stream",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tower"
version = "0.4.13"

View File

@@ -8,11 +8,18 @@ name = "packager"
path = "src/main.rs"
[features]
opentelemetry = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:tracing-opentelemetry", "tokio/tracing"]
otel = [
"dep:opentelemetry",
"dep:opentelemetry_sdk",
"dep:tracing-opentelemetry",
"dep:opentelemetry-otlp",
"dep:tonic",
"tokio/tracing"
]
prometheus = ["dep:axum-prometheus"]
tokio-console = ["dep:console-subscriber"]
default = ["opentelemetry", "prometheus", "tokio-console"]
default = ["otel", "prometheus", "tokio-console"]
[profile.dev]
opt-level = 0
@@ -23,47 +30,94 @@ lto = "off"
[dependencies.async-trait]
version = "0.1"
[dependencies.opentelemetry]
[dependencies.axum]
version = "0.7"
features = ["macros"]
[dependencies.axum-prometheus]
version = "0.6"
optional = true
[dependencies.base64]
version = "0.22"
optional = true
[dependencies.opentelemetry_sdk]
version = "0.22"
optional = true
[dependencies.tracing-opentelemetry]
version = "0.23"
optional = true
[dependencies.tracing-log]
version = "0.2"
[dependencies.http]
version = "1.1"
[dependencies.log]
version = "0.4"
[dependencies.clap]
version = "4"
features = ["derive"]
[dependencies.axum]
[dependencies.console-subscriber]
version = "0.2"
optional = true
[dependencies.futures]
version = "0.3"
[dependencies.http]
version = "1.1"
[dependencies.hyper]
version = "1.3"
features = ["full"]
[dependencies.log]
version = "0.4"
[dependencies.maud]
version = "0.26"
features = [
"axum",
]
[dependencies.metrics]
version = "0.22"
[dependencies.opentelemetry]
version = "0.22"
optional = true
[dependencies.opentelemetry-otlp]
version = "0.15"
optional = true
[dependencies.opentelemetry_sdk]
version = "0.22"
features = ["rt-tokio"]
optional = true
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_variant]
version = "0.1"
[dependencies.sha2]
version = "0.10"
[dependencies.sqlx]
version = "0.7"
features = ["macros"]
#path = "./vendor/sqlx"
features = [
"runtime-tokio-rustls",
# "offline",
"sqlite",
"macros",
"time",
"migrate",
]
[dependencies.time]
version = "0.3"
features = ["serde"]
[dependencies.tokio]
version = "1"
features = ["macros", "rt-multi-thread"]
[dependencies.console-subscriber]
version = "0.2"
[dependencies.tonic]
version = "0.11"
optional = true
[dependencies.hyper]
version = "1.3"
features = ["full"]
[dependencies.tower]
version = "0.4"
features = ["timeout"]
@@ -78,58 +132,20 @@ version = "0.1"
[dependencies.tracing-attributes]
version = "0.1"
[dependencies.tracing-log]
version = "0.2"
[dependencies.tracing-opentelemetry]
version = "0.23"
optional = true
[dependencies.tracing-subscriber]
version = "0.3"
features = ["json", "env-filter"]
[dependencies.maud]
version = "0.26"
features = [
"axum",
]
[dependencies.uuid]
version = "1"
features = [
"v4",
"serde",
]
[dependencies.sqlx]
version = "0.7"
#path = "./vendor/sqlx"
features = [
"runtime-tokio-rustls",
# "offline",
"sqlite",
"macros",
"time",
"migrate",
]
[dependencies.futures]
version = "0.3"
[dependencies.time]
version = "0.3"
features = ["serde"]
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_variant]
version = "0.1"
[dependencies.axum-prometheus]
version = "0.6"
optional = true
[dependencies.metrics]
version = "0.22"
[dependencies.sha2]
version = "0.10"
[dependencies.base64]
version = "0.22"

View File

@@ -43,7 +43,7 @@ pub struct Args {
#[arg(long)]
pub database_url: String,
#[cfg(feature = "opentelemetry")]
#[cfg(feature = "otel")]
#[arg(long, value_enum, default_value_t = BoolArg::False)]
pub enable_opentelemetry: BoolArg,

View File

@@ -42,7 +42,7 @@ async fn main() -> MainResult {
};
telemetry::tracing::init(
#[cfg(feature = "opentelemetry")]
#[cfg(feature = "otel")]
if args.enable_opentelemetry.into() {
telemetry::tracing::OpenTelemetryConfig::Enabled
} else {
@@ -142,7 +142,7 @@ async fn main() -> MainResult {
.expect("join_set is empty, this is a bug");
// EXPECT: We never expect a JoinError, as all threads run infinitely
let result = result.expect("thread panicked");
let result: Result<(), Error> = result.expect("thread panicked");
// If we get an Ok(()), something weird happened
let result = result.expect_err("thread ran to completion");

View File

@@ -22,11 +22,6 @@ use tracing::Instrument;
use uuid::Uuid;
#[cfg(feature = "opentelemetry")]
use opentelemetry::{global, trace::TracerProvider as _};
#[cfg(feature = "opentelemetry")]
use opentelemetry_sdk::trace::TracerProvider;
pub enum OpenTelemetryConfig {
Enabled,
Disabled,
@@ -66,7 +61,7 @@ fn get_stdout_layer<
stdout_layer.boxed()
}
#[cfg(feature = "opentelemetry")]
#[cfg(feature = "otel")]
fn get_opentelemetry_layer<
T: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
>(
@@ -75,20 +70,45 @@ fn get_opentelemetry_layer<
) -> Option<impl tracing_subscriber::Layer<T>> {
match config {
OpenTelemetryConfig::Enabled => {
global::set_text_map_propagator(
opentelemetry_sdk::propagation::TraceContextPropagator::new(),
);
// Sets up the machinery needed to export data to an opentelemetry endpoint.
// There are other OTel crates that provide pipelines for the vendors
// mentioned earlier.
let provider = TracerProvider::builder()
// .with_service_name()
// .with_max_packet_size(50_000)
// .with_auto_split_batch(true)
// .install_batch(Tokio)
.build();
use std::time::Duration;
let tracer = provider.tracer(env!("CARGO_PKG_NAME"));
use opentelemetry::{global, KeyValue};
use opentelemetry_otlp::WithExportConfig as _;
use opentelemetry_sdk::{
trace::{RandomIdGenerator, Sampler},
Resource,
};
use tonic::metadata::MetadataMap;
let mut metadata = MetadataMap::with_capacity(3);
metadata.insert("x-host", "localhost".parse().unwrap());
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317")
.with_timeout(Duration::from_secs(3))
.with_metadata(metadata),
)
.with_trace_config(
opentelemetry_sdk::trace::config()
.with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::default())
.with_max_events_per_span(64)
.with_max_attributes_per_span(16)
.with_max_events_per_span(16)
.with_resource(Resource::new(vec![KeyValue::new(
"service.name",
"packager",
)])),
)
.install_batch(opentelemetry_sdk::runtime::Tokio)
.unwrap();
// let tracer = provider.tracer(env!("CARGO_PKG_NAME"));
let opentelemetry_filter = {
Targets::new()
@@ -119,7 +139,7 @@ fn get_opentelemetry_layer<
type ShutdownFunction = Box<dyn FnOnce() -> Result<(), Box<dyn std::error::Error>>>;
pub async fn init<Func, T>(
#[cfg(feature = "opentelemetry")] opentelemetry_config: OpenTelemetryConfig,
#[cfg(feature = "otel")] opentelemetry_config: OpenTelemetryConfig,
#[cfg(feature = "tokio-console")] tokio_console_config: TokioConsoleConfig,
args: crate::cli::Args,
f: Func,
@@ -130,12 +150,9 @@ where
{
// mut is dependent on features (it's only required when opentelemetry is set), so
// let's just disable the lint
#[cfg(feature = "opentelemetry")]
#[allow(unused_mut)]
let mut shutdown_functions: Vec<ShutdownFunction> = vec![];
#[cfg(not(feature = "opentelemetry"))]
let shutdown_functions: Vec<ShutdownFunction> = vec![];
#[cfg(feature = "tokio-console")]
let console_layer = match tokio_console_config {
TokioConsoleConfig::Enabled => Some(console_subscriber::Builder::default().spawn()),
@@ -144,7 +161,7 @@ where
let stdout_layer = get_stdout_layer();
#[cfg(feature = "opentelemetry")]
#[cfg(feature = "otel")]
let opentelemetry_layer =
get_opentelemetry_layer(&opentelemetry_config, &mut shutdown_functions);
@@ -153,7 +170,7 @@ where
#[cfg(feature = "tokio-console")]
let registry = registry.with(console_layer);
#[cfg(feature = "opentelemetry")]
#[cfg(feature = "otel")]
let registry = registry.with(opentelemetry_layer);
// just an example, you can actuall pass Options here for layers that might be
// set/unset at runtime

View File

@@ -1,3 +1,11 @@
#!/usr/bin/env bash
docker run --rm --name packager-jaeger -p6831:6831/udp -p6832:6832/udp -p16686:16686 -p14268:14268 jaegertracing/all-in-one:latest "${@}"
docker run \
--rm \
--name \
packager-jaeger \
-p 4317:4317 \
-p 4318:4318 \
-p16686:16686 \
jaegertracing/all-in-one:latest \
"${@}"