WIP: Add otel tracing

This commit is contained in:
Daniel Lundin 2024-11-26 12:42:45 +01:00
parent 9cac938fb5
commit 3e859b5d8c
Signed by: dln
SSH key fingerprint: SHA256:dQy1Xj3UiqJYpKR5ggQ2bxgz4jCH8IF+k3AB8o0kmdI
3 changed files with 486 additions and 10 deletions
controller/src

View file

@ -7,9 +7,20 @@ use dropshot::HttpError;
use dropshot::HttpResponseOk;
use dropshot::RequestContext;
use dropshot::ServerBuilder;
use opentelemetry::{trace::TracerProvider as _, KeyValue};
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::{
trace::{RandomIdGenerator, Sampler},
Resource,
};
use opentelemetry_semantic_conventions::{
attribute::{SERVICE_NAME, SERVICE_VERSION},
SCHEMA_URL,
};
use schemars::JsonSchema;
use serde::Serialize;
use slog::Drain;
use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_slog::TracingSlogDrain;
use tracing_subscriber::prelude::*;
@ -32,7 +43,10 @@ struct VersionInfo {
method = GET,
path = "/version",
}]
async fn api_version(rqctx: RequestContext<Arc<()>>) -> Result<HttpResponseOk<VersionInfo>, HttpError> {
#[tracing::instrument()]
async fn api_version(
rqctx: RequestContext<Arc<()>>,
) -> Result<HttpResponseOk<VersionInfo>, HttpError> {
let ver = VersionInfo {
name: String::from("patagia-controller"),
};
@ -55,9 +69,38 @@ async fn main() -> Result<()> {
slog::Logger::root(async_drain, slog::o!())
};
let otlp_exporter = opentelemetry_otlp::SpanExporter::builder()
.with_tonic()
.with_endpoint("https://localhost:4317")
.build()
.map_err(|e| anyhow!("Error creating OTLP exporter: {:?}", e))?;
let resource = Resource::from_schema_url(
[
KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")),
KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")),
],
SCHEMA_URL,
);
let tracer_provider = opentelemetry_sdk::trace::TracerProvider::builder()
.with_config(
opentelemetry_sdk::trace::Config::default()
.with_sampler(Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased(
1.0,
))))
.with_id_generator(RandomIdGenerator::default())
.with_resource(resource),
)
.with_batch_exporter(otlp_exporter, opentelemetry_sdk::runtime::Tokio)
.build();
let tracer = tracer_provider.tracer("patagia-controller");
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::from_default_env())
.with(fmt_layer)
.with(OpenTelemetryLayer::new(tracer))
.init();
tracing::info!("Patagia Controller");
@ -65,10 +108,10 @@ async fn main() -> Result<()> {
let mut api = ApiDescription::new();
api.register(api_version).unwrap();
let server =ServerBuilder::new(api, Arc::new(()), dropshot_logger)
ServerBuilder::new(api, Arc::new(()), dropshot_logger)
.config(config_dropshot)
.start()
.map_err(|e| anyhow!("Error starting server: {:?}", e))?;
server.await.map_err(|e| anyhow!("Error running server: {}", e))
.map_err(|e| anyhow!("Error starting server: {:?}", e))?
.await
.map_err(|e| anyhow!(e))
}