Add proper JSON logging
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/target
|
||||
target
|
||||
client/venv
|
||||
|
||||
49
Cargo.lock
generated
49
Cargo.lock
generated
@@ -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]]
|
||||
|
||||
@@ -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
52
client/client
Executable 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
1
client/config.yaml
Normal file
@@ -0,0 +1 @@
|
||||
token: my-secret-token
|
||||
3
client/requirements.txt
Normal file
3
client/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
requests
|
||||
pyyaml
|
||||
logging
|
||||
@@ -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(
|
||||
|
||||
25
src/main.rs
25
src/main.rs
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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)?)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user