Bump to opentelemetry 0.31

This commit is contained in:
Maurus Decimus
2026-04-09 15:57:43 +02:00
parent 83c79d1fd7
commit ef8e56b4ca
8 changed files with 135 additions and 155 deletions

View File

@@ -43,10 +43,10 @@ x509-parser = "0.18"
pem = "3.0"
chrono = { version = "0.4", features = ["serde"] }
hyper = { version = "1.0.1", features = ["server", "http1", "http2"] }
opentelemetry = { version = "0.29" }
opentelemetry_sdk = { version = "0.29" }
opentelemetry-otlp = { version = "0.29", default-features = false, features = ["reqwest-client", "http-proto", "trace", "metrics", "logs", "internal-logs", "grpc-tonic", "tls-roots", "reqwest-rustls"] }
opentelemetry-semantic-conventions = { version = "0.29.0" }
opentelemetry = { git = "https://github.com/stalwartlabs/opentelemetry-rust" }
opentelemetry_sdk = { git = "https://github.com/stalwartlabs/opentelemetry-rust" }
opentelemetry-otlp = { git = "https://github.com/stalwartlabs/opentelemetry-rust", default-features = false, features = ["reqwest-client", "http-proto", "trace", "metrics", "logs", "internal-logs", "grpc-tonic", "tls-aws-lc", "tls-roots", "reqwest-rustls"] }
opentelemetry-semantic-conventions = { git = "https://github.com/stalwartlabs/opentelemetry-rust" }
prometheus = { version = "0.14", default-features = false }
imagesize = "0.14"
sha1 = "0.11"
@@ -64,7 +64,7 @@ pwhash = "1.0.0"
xxhash-rust = { version = "0.8.5", features = ["xxh3"] }
psl = "2"
aes-gcm-siv = "0.11.1"
biscuit = "0.7.0"
biscuit = "0.8.0"
rsa = "0.9.2"
p256 = { version = "0.13", features = ["ecdh"] }
p384 = { version = "0.13", features = ["ecdh"] }

View File

@@ -8,15 +8,11 @@ use crate::config::storage::Storage;
use ahash::{AHashMap, AHashSet};
use base64::{Engine, engine::general_purpose::STANDARD};
use hyper::HeaderMap;
use opentelemetry::{InstrumentationScope, KeyValue, logs::LoggerProvider};
use opentelemetry::{InstrumentationScope, KeyValue};
use opentelemetry_otlp::{
LogExporter, MetricExporter, SpanExporter, WithExportConfig, WithHttpConfig,
};
use opentelemetry_sdk::{
Resource,
logs::{SdkLogger, SdkLoggerProvider},
metrics::Temporality,
};
use opentelemetry_sdk::{Resource, metrics::Temporality};
use opentelemetry_semantic_conventions::resource::SERVICE_VERSION;
use registry::schema::{
enums::{EventPolicy, LogRotateFrequency},
@@ -57,7 +53,6 @@ pub struct OtelTracer {
pub span_exporter: SpanExporter,
pub span_exporter_enable: bool,
pub log_exporter: LogExporter,
pub log_provider: SdkLogger,
pub log_exporter_enable: bool,
pub throttle: Duration,
}
@@ -307,9 +302,6 @@ impl Tracers {
throttle: tracer.throttle.into_inner(),
span_exporter_enable: tracer.enable_span_exporter,
log_exporter_enable: tracer.enable_log_exporter,
log_provider: SdkLoggerProvider::builder()
.build()
.logger("stalwart"),
})
}
(Err(err), _) => {
@@ -356,9 +348,6 @@ impl Tracers {
throttle: tracer.throttle.into_inner(),
span_exporter_enable: tracer.enable_span_exporter,
log_exporter_enable: tracer.enable_log_exporter,
log_provider: SdkLoggerProvider::builder()
.build()
.logger("stalwart"),
})
}
(Err(err), _) => {

View File

@@ -8,8 +8,8 @@ use crate::config::telemetry::OtelMetrics;
use opentelemetry_sdk::metrics::{
Temporality,
data::{
Gauge, GaugeDataPoint, Histogram, HistogramDataPoint, Metric, ResourceMetrics,
ScopeMetrics, Sum, SumDataPoint,
AggregatedMetrics, Gauge, GaugeDataPoint, Histogram, HistogramDataPoint, Metric,
MetricData, ResourceMetrics, ScopeMetrics, Sum, SumDataPoint,
},
exporter::PushMetricExporter,
};
@@ -23,78 +23,64 @@ impl OtelMetrics {
// Add counters
for counter in Collector::collect_counters(is_enterprise) {
metrics.push(Metric {
name: counter.id().as_str().into(),
description: counter.id().description().into(),
unit: "events".into(),
data: Box::new(Sum {
data_points: vec![SumDataPoint {
attributes: vec![],
value: counter.value(),
exemplars: vec![],
}],
temporality: Temporality::Cumulative,
is_monotonic: true,
metrics.push(Metric::new(
counter.id().as_str(),
counter.id().description(),
"events",
AggregatedMetrics::U64(MetricData::Sum(Sum::new(
vec![SumDataPoint::new(vec![], counter.value(), vec![])],
start_time,
time,
}),
});
Temporality::Cumulative,
true,
))),
));
}
// Add gauges
for gauge in Collector::collect_gauges(is_enterprise) {
metrics.push(Metric {
name: gauge.id().as_str().into(),
description: gauge.id().description().into(),
unit: gauge.id().unit().into(),
data: Box::new(Gauge {
data_points: vec![GaugeDataPoint {
attributes: vec![],
value: gauge.get(),
exemplars: vec![],
}],
start_time: start_time.into(),
metrics.push(Metric::new(
gauge.id().as_str(),
gauge.id().description(),
gauge.id().unit(),
AggregatedMetrics::U64(MetricData::Gauge(Gauge::new(
vec![GaugeDataPoint::new(vec![], gauge.get(), vec![])],
Some(start_time),
time,
}),
});
))),
));
}
// Add histograms
for histogram in Collector::collect_histograms(is_enterprise) {
metrics.push(Metric {
name: histogram.id().as_str().into(),
description: histogram.id().description().into(),
unit: histogram.id().unit().into(),
data: Box::new(Histogram {
data_points: vec![HistogramDataPoint {
attributes: vec![],
count: histogram.count(),
bounds: histogram.upper_bounds_vec(),
bucket_counts: histogram.buckets_vec(),
min: histogram.min(),
max: histogram.max(),
sum: histogram.sum(),
exemplars: vec![],
}],
temporality: Temporality::Cumulative,
metrics.push(Metric::new(
histogram.id().as_str(),
histogram.id().description(),
histogram.id().unit(),
AggregatedMetrics::U64(MetricData::Histogram(Histogram::new(
vec![HistogramDataPoint::new(
vec![],
histogram.count(),
histogram.upper_bounds_vec(),
histogram.buckets_vec(),
histogram.min(),
histogram.max(),
histogram.sum(),
vec![],
)],
start_time,
time,
}),
});
Temporality::Cumulative,
))),
));
}
// Export metrics
if let Err(err) = self
.exporter
.export(&mut ResourceMetrics {
resource: self.resource.clone(),
scope_metrics: vec![ScopeMetrics {
scope: self.instrumentation.clone(),
metrics,
}],
})
.await
{
let rm = ResourceMetrics::new(
self.resource.clone(),
vec![ScopeMetrics::new(self.instrumentation.clone(), metrics)],
);
if let Err(err) = self.exporter.export(&rm).await {
trc::event!(
Telemetry(TelemetryEvent::OtelMetricsExporterError),
Reason = err.to_string(),

View File

@@ -171,6 +171,7 @@ where
),
dropped_attributes_count: 0,
parent_span_id: 0.into(),
parent_span_is_remote: false,
name: start_span.inner.typ.as_str().into(),
start_time: UNIX_EPOCH + Duration::from_secs(start_span.inner.timestamp),
end_time: UNIX_EPOCH + Duration::from_secs(end_span.inner.timestamp),
@@ -186,9 +187,8 @@ where
impl OtelTracer {
fn build_log_record(&self, event: &Event<EventDetails>) -> SdkLogRecord {
use opentelemetry::logs::LogRecord;
use opentelemetry::logs::Logger;
let mut record = self.log_provider.create_log_record();
let mut record = SdkLogRecord::new();
record.set_event_name(event.inner.typ.as_str());
record.set_severity_number(match event.inner.level {
Level::Trace => Severity::Trace,

View File

@@ -15,8 +15,7 @@ pub mod diagnose;
use crate::{
api::diagnose::{DeliveryStage, spawn_delivery_diagnose},
auth::{
authenticate::Authenticator, oauth::auth::OAuthApiHandler,
permissions::PermissionsApiHandler,
authenticate::Authenticator, oauth::auth::OAuthApiHandler, permissions::AccountApiHandler,
},
};
use common::{
@@ -85,10 +84,10 @@ impl ManagementApi for Server {
Err(trc::ResourceEvent::NotFound.into_err())
}
}
"permissions" => {
"account" => {
// Authenticate request
let (_in_flight, access_token) = self.authenticate_headers(req, session).await?;
self.handle_permissions_request(&access_token).await
self.handle_account_request(&access_token).await
}
"token" => {
let access_token = self.management_access_token(req, session).await?;

View File

@@ -6,24 +6,25 @@
use common::{Server, auth::AccessToken};
use http_proto::{HttpResponse, JsonResponse, ToHttpResponse};
use registry::schema::enums::Permission;
use registry::schema::enums::{Locale, Permission};
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct Permissions {
pub struct Account {
pub permissions: Vec<Permission>,
pub edition: &'static str,
pub locale: Locale,
}
pub trait PermissionsApiHandler: Sync + Send {
fn handle_permissions_request(
pub trait AccountApiHandler: Sync + Send {
fn handle_account_request(
&self,
access_token: &AccessToken,
) -> impl Future<Output = trc::Result<HttpResponse>> + Send;
}
impl PermissionsApiHandler for Server {
async fn handle_permissions_request(
impl AccountApiHandler for Server {
async fn handle_account_request(
&self,
access_token: &AccessToken,
) -> trc::Result<HttpResponse> {
@@ -41,9 +42,12 @@ impl PermissionsApiHandler for Server {
};
// SPDX-SnippetEnd
Ok(JsonResponse::new(Permissions {
let account_info = self.account_info(access_token.account_id()).await?;
Ok(JsonResponse::new(Account {
permissions: access_token.permissions(),
edition,
locale: account_info.locale(),
})
.into_http_response())
}