Skip to content

Commit 15700c6

Browse files
authored
feat(geth-engine): add core runtime metrics (#37)
1 parent 59274d8 commit 15700c6

12 files changed

Lines changed: 630 additions & 52 deletions

File tree

Cargo.lock

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

geth-engine/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,13 @@ features = ["trace", "logs", "grpc-tonic"]
4545

4646
[dependencies]
4747
tonic = "0.13"
48+
tower = "0.5"
4849
tracing = "0.1"
4950
tracing-opentelemetry = "0.31"
5051
opentelemetry = "0.30"
5152
opentelemetry_sdk = "0.30"
5253
opentelemetry-appender-tracing = "0.30"
53-
54+
http = "1"
5455
bytes = "1"
5556
eyre = "0.6"
5657
chrono = "0.4"
@@ -59,6 +60,7 @@ moka = "0.11"
5960
async-trait = "0.1.71"
6061
serde = { version = "1", features = ["derive"] }
6162
base64 = "0.22"
63+
sysinfo = "0.35"
6264

6365
[build-dependencies]
6466
built = { version = "0.8", features = ["git2"] }

geth-engine/src/lib.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
use crate::metrics::configure_metrics;
12
pub use crate::options::Options;
23

34
mod domain;
5+
mod metrics;
46
mod names;
57
mod options;
68
mod process;
@@ -11,7 +13,9 @@ use geth_mikoshi::{
1113
use opentelemetry::{trace::TracerProvider, KeyValue};
1214
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge;
1315
use opentelemetry_otlp::WithExportConfig;
14-
use opentelemetry_sdk::{logs::SdkLoggerProvider, trace::SdkTracerProvider, Resource};
16+
use opentelemetry_sdk::{
17+
logs::SdkLoggerProvider, metrics::PeriodicReader, trace::SdkTracerProvider, Resource,
18+
};
1519
pub use process::{
1620
indexing::IndexClient,
1721
manager::{start_process_manager_with_catalog, Catalog, CatalogBuilder, ManagerClient},
@@ -87,6 +91,7 @@ impl EmbeddedClient {
8791
struct TelemetryHandles {
8892
traces: Option<SdkTracerProvider>,
8993
logs: Option<SdkLoggerProvider>,
94+
metrics: Option<opentelemetry_sdk::metrics::SdkMeterProvider>,
9095
}
9196

9297
impl TelemetryHandles {
@@ -99,11 +104,17 @@ impl TelemetryHandles {
99104
provider.shutdown()?;
100105
}
101106

107+
if let Some(provider) = self.metrics {
108+
provider.shutdown()?;
109+
}
110+
102111
Ok(())
103112
}
104113
}
105114

106115
pub async fn run_embedded(options: &Options) -> eyre::Result<EmbeddedClient> {
116+
configure_metrics();
117+
107118
let handles = if options.telemetry.disabled {
108119
TelemetryHandles::default()
109120
} else {
@@ -176,7 +187,7 @@ fn init_telemetry(options: &Options) -> eyre::Result<TelemetryHandles> {
176187

177188
let log_provider = SdkLoggerProvider::builder()
178189
.with_batch_exporter(log_exporter)
179-
.with_resource(resource)
190+
.with_resource(resource.clone())
180191
.build();
181192

182193
handles.logs = Some(log_provider.clone());
@@ -186,6 +197,31 @@ fn init_telemetry(options: &Options) -> eyre::Result<TelemetryHandles> {
186197
None
187198
};
188199

200+
if let Some(endpoint) = options
201+
.telemetry
202+
.metrics_endpoint
203+
.as_ref()
204+
.or(options.telemetry.endpoint.as_ref())
205+
{
206+
let metric_exporter = opentelemetry_otlp::MetricExporter::builder()
207+
.with_http()
208+
.with_endpoint(format!("{endpoint}/ingest/otlp/v1/metrics"))
209+
.build()?;
210+
211+
let reader = PeriodicReader::builder(metric_exporter)
212+
.with_interval(std::time::Duration::from_secs(10))
213+
.build();
214+
215+
let meter_provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
216+
.with_reader(reader)
217+
.with_resource(resource)
218+
.build();
219+
220+
handles.metrics = Some(meter_provider.clone());
221+
222+
opentelemetry::global::set_meter_provider(meter_provider);
223+
}
224+
189225
let fmt_layer = if options.telemetry.endpoint.is_none() {
190226
let layer = tracing_subscriber::fmt::layer()
191227
.with_file(true)

0 commit comments

Comments
 (0)