add prometheus

This commit is contained in:
houseme
2025-03-26 15:18:23 +08:00
parent 2b57af75ea
commit 23ead0ea99
4 changed files with 61 additions and 6 deletions
Generated
+39 -2
View File
@@ -4333,6 +4333,20 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "opentelemetry-prometheus"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ac8c4fc7bd450bcb5b1cbc7325755e86d9f82f1fd80ad8b3441887b715f6a2d"
dependencies = [
"once_cell",
"opentelemetry",
"opentelemetry_sdk",
"prometheus",
"protobuf 2.28.0",
"tracing",
]
[[package]] [[package]]
name = "opentelemetry-proto" name = "opentelemetry-proto"
version = "0.29.0" version = "0.29.0"
@@ -4961,6 +4975,21 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "prometheus"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1"
dependencies = [
"cfg-if",
"fnv",
"lazy_static",
"memchr",
"parking_lot 0.12.3",
"protobuf 2.28.0",
"thiserror 1.0.69",
]
[[package]] [[package]]
name = "prost" name = "prost"
version = "0.13.5" version = "0.13.5"
@@ -5013,6 +5042,12 @@ dependencies = [
"prost", "prost",
] ]
[[package]]
name = "protobuf"
version = "2.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
[[package]] [[package]]
name = "protobuf" name = "protobuf"
version = "3.7.2" version = "3.7.2"
@@ -5041,7 +5076,7 @@ dependencies = [
"flatbuffers", "flatbuffers",
"prost", "prost",
"prost-build", "prost-build",
"protobuf", "protobuf 3.7.2",
"tokio", "tokio",
"tonic", "tonic",
"tonic-build", "tonic-build",
@@ -5631,7 +5666,7 @@ dependencies = [
"prost", "prost",
"prost-build", "prost-build",
"prost-types", "prost-types",
"protobuf", "protobuf 3.7.2",
"protos", "protos",
"rmp-serde", "rmp-serde",
"rust-embed", "rust-embed",
@@ -5691,9 +5726,11 @@ dependencies = [
"opentelemetry", "opentelemetry",
"opentelemetry-appender-tracing", "opentelemetry-appender-tracing",
"opentelemetry-otlp", "opentelemetry-otlp",
"opentelemetry-prometheus",
"opentelemetry-semantic-conventions", "opentelemetry-semantic-conventions",
"opentelemetry-stdout", "opentelemetry-stdout",
"opentelemetry_sdk", "opentelemetry_sdk",
"prometheus",
"rdkafka", "rdkafka",
"reqwest", "reqwest",
"serde", "serde",
+2
View File
@@ -66,8 +66,10 @@ opentelemetry-appender-tracing = { version = "0.29.1", features = ["experimental
opentelemetry_sdk = { version = "0.29" } opentelemetry_sdk = { version = "0.29" }
opentelemetry-stdout = { version = "0.29.0" } opentelemetry-stdout = { version = "0.29.0" }
opentelemetry-otlp = { version = "0.29" } opentelemetry-otlp = { version = "0.29" }
opentelemetry-prometheus = { version = "0.29" }
opentelemetry-semantic-conventions = { version = "0.29.0", features = ["semconv_experimental"] } opentelemetry-semantic-conventions = { version = "0.29.0", features = ["semconv_experimental"] }
pin-project-lite = "0.2" pin-project-lite = "0.2"
prometheus = "0.13.4"
# pin-utils = "0.1.0" # pin-utils = "0.1.0"
prost = "0.13.4" prost = "0.13.4"
prost-build = "0.13.4" prost-build = "0.13.4"
+2
View File
@@ -24,7 +24,9 @@ opentelemetry-appender-tracing = { workspace = true, features = ["experimental_u
opentelemetry_sdk = { workspace = true, features = ["rt-tokio"] } opentelemetry_sdk = { workspace = true, features = ["rt-tokio"] }
opentelemetry-stdout = { workspace = true } opentelemetry-stdout = { workspace = true }
opentelemetry-otlp = { workspace = true, features = ["grpc-tonic", "gzip-tonic"] } opentelemetry-otlp = { workspace = true, features = ["grpc-tonic", "gzip-tonic"] }
opentelemetry-prometheus = { workspace = true }
opentelemetry-semantic-conventions = { workspace = true, features = ["semconv_experimental"] } opentelemetry-semantic-conventions = { workspace = true, features = ["semconv_experimental"] }
prometheus = { workspace = true }
serde = { workspace = true } serde = { workspace = true }
tracing = { workspace = true, features = ["std", "attributes"] } tracing = { workspace = true, features = ["std", "attributes"] }
tracing-core = { workspace = true } tracing-core = { workspace = true }
+18 -4
View File
@@ -13,6 +13,7 @@ use opentelemetry_semantic_conventions::{
attribute::{DEPLOYMENT_ENVIRONMENT_NAME, NETWORK_LOCAL_ADDRESS, SERVICE_NAME, SERVICE_VERSION}, attribute::{DEPLOYMENT_ENVIRONMENT_NAME, NETWORK_LOCAL_ADDRESS, SERVICE_NAME, SERVICE_VERSION},
SCHEMA_URL, SCHEMA_URL,
}; };
use prometheus::Registry;
use std::io::IsTerminal; use std::io::IsTerminal;
use tracing_error::ErrorLayer; use tracing_error::ErrorLayer;
use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer}; use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer};
@@ -45,6 +46,13 @@ pub struct OtelGuard {
tracer_provider: SdkTracerProvider, tracer_provider: SdkTracerProvider,
meter_provider: SdkMeterProvider, meter_provider: SdkMeterProvider,
logger_provider: SdkLoggerProvider, logger_provider: SdkLoggerProvider,
registry: Registry,
}
impl OtelGuard {
pub fn get_registry(&self) -> &Registry {
&self.registry
}
} }
impl Drop for OtelGuard { impl Drop for OtelGuard {
@@ -78,7 +86,7 @@ fn resource(config: &OtelConfig) -> Resource {
} }
/// Initialize Meter Provider /// Initialize Meter Provider
fn init_meter_provider(config: &OtelConfig) -> SdkMeterProvider { fn init_meter_provider(config: &OtelConfig) -> (SdkMeterProvider, Registry) {
let mut builder = MeterProviderBuilder::default().with_resource(resource(config)); let mut builder = MeterProviderBuilder::default().with_resource(resource(config));
// If endpoint is empty, use stdout output // If endpoint is empty, use stdout output
if config.endpoint.is_empty() { if config.endpoint.is_empty() {
@@ -109,10 +117,15 @@ fn init_meter_provider(config: &OtelConfig) -> SdkMeterProvider {
); );
} }
} }
let registry = Registry::new();
let prometheus_exporter = opentelemetry_prometheus::exporter()
.with_registry(registry.clone())
.build()
.unwrap();
let meter_provider = builder.build(); let meter_provider = builder.with_reader(prometheus_exporter).build();
global::set_meter_provider(meter_provider.clone()); global::set_meter_provider(meter_provider.clone());
meter_provider (meter_provider, registry)
} }
/// Initialize Tracer Provider /// Initialize Tracer Provider
@@ -154,7 +167,7 @@ fn init_tracer_provider(config: &OtelConfig) -> SdkTracerProvider {
/// Initialize Telemetry /// Initialize Telemetry
pub fn init_telemetry(config: &OtelConfig) -> OtelGuard { pub fn init_telemetry(config: &OtelConfig) -> OtelGuard {
let tracer_provider = init_tracer_provider(config); let tracer_provider = init_tracer_provider(config);
let meter_provider = init_meter_provider(config); let (meter_provider, prometheus_registry) = init_meter_provider(config);
let tracer = tracer_provider.tracer(config.service_name.clone()); let tracer = tracer_provider.tracer(config.service_name.clone());
// Initialize logger provider based on configuration // Initialize logger provider based on configuration
@@ -229,5 +242,6 @@ pub fn init_telemetry(config: &OtelConfig) -> OtelGuard {
tracer_provider, tracer_provider,
meter_provider, meter_provider,
logger_provider, logger_provider,
registry: prometheus_registry,
} }
} }