sentrystr 0.2.0

Core library for publishing Sentry-like events to Nostr network
Documentation
use nostr::Keys;
use sentrystr::{Config, Event, Level, NostrSentryClient};

#[tokio::main]
async fn main() -> sentrystr::Result<()> {
    println!("SentryStr Tagged Events Example");
    println!("==============================");

    let sender_keys = Keys::generate();
    println!("Sender public key: {}", sender_keys.public_key());

    let relays = vec![
        "wss://relay.damus.io".to_string(),
        "wss://nostr.chaima.info".to_string(),
    ];

    let config = Config::new(
        sender_keys.secret_key().display_secret().to_string(),
        relays,
    );

    let client = NostrSentryClient::new(config).await?;

    println!();
    println!("Publishing events with different tags...");

    let auth_error = Event::new()
        .with_message("Authentication failed for user admin")
        .with_level(Level::Error)
        .with_service_tag("auth-service")
        .with_environment_tag("production")
        .with_component_tag("login")
        .with_severity_tag(&Level::Error)
        .with_tag("user_id", "admin")
        .with_extra("attempt_count", serde_json::json!(3));

    let event_id = client.capture_event(auth_error).await?;
    println!("Published auth error event: {}", event_id);

    let db_warning = Event::new()
        .with_message("Database connection pool running low")
        .with_level(Level::Warning)
        .with_service_tag("database-service")
        .with_environment_tag("production")
        .with_component_tag("connection-pool")
        .with_severity_tag(&Level::Warning)
        .with_extra("pool_size", serde_json::json!(2));

    let event_id = client.capture_event(db_warning).await?;
    println!("Published database warning event: {}", event_id);

    let api_info = Event::new()
        .with_message("API request processed successfully")
        .with_level(Level::Info)
        .with_service_tag("api-gateway")
        .with_environment_tag("production")
        .with_component_tag("request-handler")
        .with_severity_tag(&Level::Info)
        .with_tag("endpoint", "/users")
        .with_tag("method", "GET")
        .with_extra("response_time_ms", serde_json::json!(45));

    let event_id = client.capture_event(api_info).await?;
    println!("Published API info event: {}", event_id);

    let test_debug = Event::new()
        .with_message("Debug trace for test environment")
        .with_level(Level::Debug)
        .with_service_tag("test-runner")
        .with_environment_tag("staging")
        .with_component_tag("unit-tests")
        .with_severity_tag(&Level::Debug)
        .with_tag("test_name", "auth_test_001");

    let event_id = client.capture_event(test_debug).await?;
    println!("Published test debug event: {}", event_id);

    println!();
    println!("All events published successfully!");
    println!();
    println!("To collect these events with filtering, try:");
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {}",
        sender_keys.public_key()
    );
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {} --service auth-service",
        sender_keys.public_key()
    );
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {} --environment production",
        sender_keys.public_key()
    );
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {} --component login",
        sender_keys.public_key()
    );
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {} --level error",
        sender_keys.public_key()
    );
    println!(
        "cargo run --bin sentrystr-collector -- collect --author {} --tag user_id=admin",
        sender_keys.public_key()
    );

    client.disconnect().await?;
    Ok(())
}