From 645744e08cfdc1a89fe27407b9dca5fb35ffab20 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sun, 24 Dec 2023 23:36:11 -0600 Subject: [PATCH] switched to tracing --- server/Cargo.toml | 11 ++++++---- server/src/blocks.rs | 2 +- server/src/depot.rs | 4 ++-- server/src/fell.rs | 7 +++++-- server/src/main.rs | 43 ++++++++++++++++++++++++++++++++++++++-- server/src/mine.rs | 2 +- server/src/paths.rs | 2 +- server/src/safe_kill.rs | 2 +- server/src/tasks.rs | 2 +- server/src/turtle.rs | 13 +++++++----- server/src/turtle_api.rs | 4 ++-- 11 files changed, 70 insertions(+), 22 deletions(-) diff --git a/server/Cargo.toml b/server/Cargo.toml index 4284ae2..77b7b77 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -18,9 +18,12 @@ hilbert_index = "0.2.0" hyper = "1.0.1" hyper-util = "0.1.1" indoc = "2.0.4" -log = "0.4.20" -log4rs = "1.2.0" nalgebra = { version = "0.32.3", features = ["serde-serialize"] } +opentelemetry = "0.21.0" +opentelemetry-appender-tracing = "0.2.0" +opentelemetry-otlp = { version = "0.14.0", features = ["logs", "http-proto", "reqwest-client"] } +opentelemetry-semantic-conventions = "0.13.0" +opentelemetry_sdk = { version = "0.21.1", features = ["logs", "rt-tokio"] } parking_lot = { version = "0.11", features = ["serde"] } pathfinding = "4.6.0" rstar = { version = "0.11.0", features = ["serde"] } @@ -28,7 +31,7 @@ rustmatica = "0.1.1" serde = { version = "1.0.193", features = ["rc", "derive"] } serde_json = "1.0.108" time = { version = "0.3.31", features = ["serde"] } -tokio = { version = "1.0", features = ["full"] } +tokio = { version = "1.0", features = ["full", "tracing"] } tower = { version = "0.4", features = ["util", "timeout", "load-shed", "limit"] } tower-http = { version = "0.5.0", features = [ "add-extension", @@ -39,6 +42,6 @@ tower-http = { version = "0.5.0", features = [ ] } tower-layer = "0.3.2" tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.18", features = ["registry", "std"] } typetag = "0.2.14" ucnlnav = { git = "https://github.com/ucnl/UCNLNav.git", version = "0.1.0" } diff --git a/server/src/blocks.rs b/server/src/blocks.rs index b41e3b8..253ae13 100644 --- a/server/src/blocks.rs +++ b/server/src/blocks.rs @@ -9,7 +9,7 @@ use crate::{turtle::TurtleCommand, paths::{self, TRANSPARENT}}; pub type WorldReadLock = OwnedRwLockReadGuard>; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct World { state: Arc>>, // interior mutability to get around the // questionable architecture of this project diff --git a/server/src/depot.rs b/server/src/depot.rs index 776e9cc..5d3b1ff 100644 --- a/server/src/depot.rs +++ b/server/src/depot.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use log::{warn, info, trace}; +use tracing::{warn, info, trace}; use tokio::sync::{Mutex, OwnedMutexGuard}; use crate::{blocks::Position, turtle::TurtleCommander}; @@ -11,7 +11,7 @@ use crate::turtle::{TurtleCommand::*, TurtleCommandResponse}; /// /// below the specified position is an output chest of infinite capacity /// ahead of the specified position is a chest of combustibles -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Depots { depots: Arc>>>> } diff --git a/server/src/fell.rs b/server/src/fell.rs index fd0ec99..b263732 100644 --- a/server/src/fell.rs +++ b/server/src/fell.rs @@ -1,6 +1,6 @@ use std::ops::{Mul, Add}; -use log::{trace, warn, info, error}; +use tracing::{trace, warn, info, error}; use nalgebra::Vector2; use serde::{Serialize, Deserialize}; use time::OffsetDateTime; @@ -9,6 +9,7 @@ use typetag::serde; use crate::{blocks::{Vec3, Position, Direction}, turtle::{TurtleCommander, TurtleCommand, TurtleCommandResponse, InventorySlot}, tasks::{Task, TaskState}, depot::Depots, mine::fill, paths::TRANSPARENT}; +#[tracing::instrument] pub async fn fell_tree(turtle: TurtleCommander, bottom: Vec3) -> Option<()> { let mut log = bottom; loop { @@ -25,7 +26,7 @@ pub async fn fell_tree(turtle: TurtleCommander, bottom: Vec3) -> Option<()> { /// Minutes before checking const SWEEP_DELAY: i64 = 16; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize, Clone, Debug)] pub struct TreeFarm { position: Vec3, size: Vec3, @@ -41,6 +42,7 @@ impl TreeFarm { } } + #[tracing::instrument] pub async fn sweep(&self, turtle: TurtleCommander) -> Option<()> { let trees = self.size.product(); let spacing = Vec3::new(2, 32, 2); @@ -139,6 +141,7 @@ impl TreeFarm { #[serde] impl Task for TreeFarm { + #[tracing::instrument] fn run(&mut self,turtle:TurtleCommander) -> AbortHandle { let frozen = self.clone(); tokio::spawn(async move { diff --git a/server/src/main.rs b/server/src/main.rs index 34dc7d5..e87e798 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -10,7 +10,7 @@ use axum::{ }; use blocks::{World, Position, }; use depot::Depots; -use log::info; +use tracing::info; use rstar::RTree; use names::Name; @@ -21,6 +21,14 @@ use tokio::{sync::{ use turtle::{Turtle, TurtleCommander}; use serde::{Deserialize, Serialize}; use indoc::formatdoc; +use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge; +use tracing_subscriber::prelude::*; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry::{global, KeyValue}; +use opentelemetry_sdk::logs as sdklogs; +use opentelemetry_sdk::metrics as sdkmetrics; +use opentelemetry_sdk::resource; +use opentelemetry_sdk::trace as sdktrace; use crate::blocks::Block; @@ -52,7 +60,35 @@ async fn main() -> Result<(), Error> { None => "save".into(), })?; - log4rs::init_file(SAVE.get().unwrap().join("log.yml"), Default::default())?; + opentelemetry_otlp::new_pipeline() + .logging() + .with_log_config( + sdklogs::Config::default().with_resource(resource::Resource::new(vec![KeyValue::new( + opentelemetry_semantic_conventions::resource::SERVICE_NAME, + "avarus", + )])), + ) + .with_exporter( + opentelemetry_otlp::new_exporter() + .http() + .with_endpoint("http://localhost:4318"), + ) + .install_batch(opentelemetry_sdk::runtime::Tokio)?; + + opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .http() + .with_endpoint("http://localhost:4318/v1/traces"), + ) + .install_batch(opentelemetry_sdk::runtime::Tokio)?; + + let tracer = global::tracer("avarus/basic"); + + let logger_provider = opentelemetry::global::logger_provider(); + let layer = OpenTelemetryTracingBridge::new(&logger_provider); + tracing_subscriber::registry().with(layer).init(); let (kill_send, kill_recv) = watch::channel(()); @@ -75,6 +111,9 @@ async fn main() -> Result<(), Error> { write_to_disk(&*state.read().await).await?; info!("written"); + global::shutdown_tracer_provider(); + global::shutdown_logger_provider(); + state.write().await.kill.closed().await; Ok(()) diff --git a/server/src/mine.rs b/server/src/mine.rs index 48d0ba1..6b40e6f 100644 --- a/server/src/mine.rs +++ b/server/src/mine.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, atomic::{AtomicUsize, Ordering, AtomicI32}}; -use log::{info, warn, error}; +use tracing::{info, warn, error}; use serde::{Serialize, Deserialize}; use tokio::task::{JoinHandle, AbortHandle}; use typetag::serde; diff --git a/server/src/paths.rs b/server/src/paths.rs index 2aa5f58..5c70433 100644 --- a/server/src/paths.rs +++ b/server/src/paths.rs @@ -1,7 +1,7 @@ use crate::{ blocks::{World, Position, Direction, Vec3, WorldReadLock}, }; -use log::{trace, error}; +use tracing::{trace, error}; use pathfinding::prelude::astar; const LOOKUP_LIMIT: usize = 10_000_000; diff --git a/server/src/safe_kill.rs b/server/src/safe_kill.rs index d064f85..fdc21dd 100644 --- a/server/src/safe_kill.rs +++ b/server/src/safe_kill.rs @@ -1,4 +1,4 @@ -use log::{error, info}; +use tracing::{error, info}; use tokio::net::TcpListener; use tokio::signal; diff --git a/server/src/tasks.rs b/server/src/tasks.rs index ddfad21..030f39e 100644 --- a/server/src/tasks.rs +++ b/server/src/tasks.rs @@ -1,4 +1,4 @@ -use log::{info, trace}; +use tracing::{info, trace}; use serde::{Deserialize, Serialize}; use tokio::sync::oneshot; use tokio::task::{JoinHandle, AbortHandle}; diff --git a/server/src/turtle.rs b/server/src/turtle.rs index 2ff50a8..278477d 100644 --- a/server/src/turtle.rs +++ b/server/src/turtle.rs @@ -10,9 +10,9 @@ use anyhow::Ok; use anyhow; use anyhow::Context; -use log::trace; -use log::warn; -use log::info; +use tracing::trace; +use tracing::warn; +use tracing::info; use tokio::sync::Mutex; use tokio::sync::OnceCell; use tokio::sync::RwLock; @@ -139,7 +139,7 @@ impl Turtle { } } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct TurtleCommander { sender: Arc, world: World, @@ -179,6 +179,7 @@ impl TurtleCommander { } } + #[tracing::instrument] pub async fn execute(&self, command: TurtleCommand) -> TurtleInfo { let (send, recv) = oneshot::channel::(); @@ -211,6 +212,7 @@ impl TurtleCommander { self.world.clone() } + #[tracing::instrument] pub async fn dock(&self) -> usize { let mut wait = 1; loop { @@ -229,6 +231,7 @@ impl TurtleCommander { self.depots.dock(self.clone()).await } + #[tracing::instrument] pub async fn goto(&self, pos: Position) -> Option<()> { let mut recent = self.pos().await; let world = self.world.clone(); @@ -277,6 +280,7 @@ impl TurtleCommander { Some(()) } + #[tracing::instrument] pub async fn goto_adjacent(&self, pos: Vec3) -> Option { let mut recent = self.pos().await; let world = self.world.clone(); @@ -325,7 +329,6 @@ impl TurtleCommander { } } - pub(crate) async fn process_turtle_update( id: u32, state: &LiveState, diff --git a/server/src/turtle_api.rs b/server/src/turtle_api.rs index 389e7ab..c4546a6 100644 --- a/server/src/turtle_api.rs +++ b/server/src/turtle_api.rs @@ -1,4 +1,4 @@ -use log::trace; +use tracing::trace; use tokio; use blocks::Vec3; use tokio::time::Instant; @@ -12,7 +12,7 @@ use crate::turtle::TurtleInfo; use axum::extract::Path; use crate::turtle::TurtleCommand; use crate::names::Name; -use log::info; +use tracing::info; use std::collections::VecDeque; use blocks::Position; use crate::turtle::Turtle;