Add proper JSON logging

This commit is contained in:
2025-05-28 10:00:02 +02:00
parent 5cbeb51f62
commit f5cb95071b
9 changed files with 129 additions and 16 deletions

3
.gitignore vendored
View File

@@ -1 +1,2 @@
/target
target
client/venv

49
Cargo.lock generated
View File

@@ -815,6 +815,15 @@ version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "matchers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
dependencies = [
"regex-automata 0.1.10",
]
[[package]]
name = "matchit"
version = "0.8.4"
@@ -1115,11 +1124,13 @@ name = "rdockup"
version = "0.1.0"
dependencies = [
"axum",
"log",
"oci-client",
"serde",
"serde_json",
"tokio",
"tower-http",
"tracing",
"tracing-subscriber",
]
@@ -1140,8 +1151,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
"regex-automata 0.4.9",
"regex-syntax 0.8.5",
]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [
"regex-syntax 0.6.29",
]
[[package]]
@@ -1152,9 +1172,15 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
"regex-syntax 0.8.5",
]
[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
version = "0.8.5"
@@ -1680,18 +1706,35 @@ dependencies = [
"tracing-core",
]
[[package]]
name = "tracing-serde"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1"
dependencies = [
"serde",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
dependencies = [
"matchers",
"nu-ansi-term",
"once_cell",
"regex",
"serde",
"serde_json",
"sharded-slab",
"smallvec",
"thread_local",
"tracing",
"tracing-core",
"tracing-log",
"tracing-serde",
]
[[package]]

View File

@@ -10,4 +10,6 @@ axum = "0.8"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tower-http = { version = "0.6", features = ["trace"] }
tracing-subscriber = "0.3"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
tracing = "0.1"
log = "0.4"

52
client/client Executable file
View File

@@ -0,0 +1,52 @@
#!/bin/env python
import sys
import logging
import yaml
from requests import Session
# Global variables
base_url = "http://127.0.0.1:3000/api"
def get_events(s, image):
data = {
"image": image,
}
try:
r = s.post(base_url + "/tags", json=data)
return r.text
except Exception as e:
logging.error(e)
sys.exit(1)
def main():
# Initialize logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S", # Explicit date format
)
# Import config from file
with open("./config.yaml", "r", encoding="utf8") as file:
config = yaml.safe_load(file)
token = config["token"]
# Read command line argument
image = sys.argv[1]
s = Session()
s.headers.update(
{
'Authorization': f"Bearer {token}",
'Content-type': 'application/json'
}
)
print(get_events(s, image))
if __name__ == "__main__":
main()

1
client/config.yaml Normal file
View File

@@ -0,0 +1 @@
token: my-secret-token

3
client/requirements.txt Normal file
View File

@@ -0,0 +1,3 @@
requests
pyyaml
logging

View File

@@ -19,7 +19,7 @@ fn validate_token(token: &str) -> bool {
}
pub fn create_router() -> Router {
Router::new().route("/tags", post(get_tags_handler))
Router::new().route("/api/tags", post(get_tags_handler))
}
async fn get_tags_handler(

View File

@@ -1,21 +1,30 @@
mod api;
mod registry_client;
// use axum::Router;
use tower_http::trace::TraceLayer;
use tracing_subscriber::{filter::LevelFilter, layer::SubscriberExt, util::SubscriberInitExt};
use tower_http::trace::{self, TraceLayer};
use tracing::{Level, info};
// use tracing_subscriber::EnvFilter;
#[tokio::main]
async fn main() {
// Initialize logging for access logs
tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer())
.with(LevelFilter::INFO)
tracing_subscriber::fmt()
// .with_env_filter(
// EnvFilter::try_from_default_env()
// .or_else(|_| EnvFilter::try_new("rdockup=error,tower_http=warn"))
// .unwrap(),
// )
.with_target(false)
.json()
.init();
// Build app with routes from api module and add logging middleware
let app = api::create_router().layer(TraceLayer::new_for_http());
let app = api::create_router().layer(
TraceLayer::new_for_http()
.make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO))
.on_response(trace::DefaultOnResponse::new().level(Level::INFO)),
);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
info!("Starting server on {:?}", listener);
axum::serve(listener, app).await.unwrap();
}

View File

@@ -12,10 +12,12 @@ pub async fn get_tags(image: &str) -> Result<String, Box<dyn std::error::Error>>
let client = Client::new(ClientConfig::default());
let img_ref: Reference = image.parse()?;
let auth = RegistryAuth::Anonymous;
let tags = client.list_tags(&img_ref, &auth, None, None).await?;
let tags = client
.list_tags(&img_ref, &auth, Some(100), Some("17"))
.await?;
let serialized_tags = SerializableTags {
name: &tags.name,
tags: &tags.tags,
};
Ok(serde_json::to_string_pretty(&serialized_tags)?)
Ok(serde_json::to_string(&serialized_tags)?)
}