0.7.30
This commit is contained in:
@@ -42,6 +42,7 @@ mod program_instruction_discriminator_summary;
|
||||
mod wallet_participation;
|
||||
|
||||
pub(crate) use local_pipeline_diagnostics::LocalDecodedEventDiagnosticSummaryRow;
|
||||
pub(crate) use local_pipeline_diagnostics::LocalEventClassificationDiagnosticSummaryRow;
|
||||
pub(crate) use local_pipeline_diagnostics::LocalDexDiagnosticSummaryRow;
|
||||
pub(crate) use local_pipeline_diagnostics::LocalDuplicateDecodedEventTradeDiagnosticSampleRow;
|
||||
pub(crate) use local_pipeline_diagnostics::LocalMissingTradeEventDiagnosticSampleRow;
|
||||
@@ -68,6 +69,7 @@ pub use launch_surface::LaunchSurfaceDto;
|
||||
pub use launch_surface_key::LaunchSurfaceKeyDto;
|
||||
pub use liquidity_event::LiquidityEventDto;
|
||||
pub use local_pipeline_diagnostics::LocalDecodedEventDiagnosticSummaryDto;
|
||||
pub use local_pipeline_diagnostics::LocalEventClassificationDiagnosticSummaryDto;
|
||||
pub use local_pipeline_diagnostics::LocalDexDiagnosticSummaryDto;
|
||||
pub use local_pipeline_diagnostics::LocalDuplicateDecodedEventTradeDiagnosticSampleDto;
|
||||
pub use local_pipeline_diagnostics::LocalMissingTradeEventDiagnosticSampleDto;
|
||||
|
||||
@@ -17,6 +17,12 @@ pub struct LocalPipelineDiagnosticSummaryDto {
|
||||
pub decoded_trade_candidate_count: i64,
|
||||
/// Total decoded DEX candle candidates.
|
||||
pub decoded_candle_candidate_count: i64,
|
||||
/// Total decoded useful non-trade events.
|
||||
pub decoded_non_trade_useful_event_count: i64,
|
||||
/// Total decoded swap-like events that are intentionally non-actionable.
|
||||
pub decoded_non_actionable_trade_event_count: i64,
|
||||
/// Total decoded events with unknown classification.
|
||||
pub decoded_unknown_event_count: i64,
|
||||
/// Whether the local persisted pipeline has no blocking diagnostic issue.
|
||||
pub diagnostics_clean: bool,
|
||||
/// Number of blocking diagnostic issues.
|
||||
@@ -69,6 +75,9 @@ pub struct LocalPipelineDiagnosticSummaryDto {
|
||||
pub pair_summaries: std::vec::Vec<crate::LocalPairDiagnosticSummaryDto>,
|
||||
/// Diagnostics grouped by decoded event kind.
|
||||
pub decoded_event_summaries: std::vec::Vec<crate::LocalDecodedEventDiagnosticSummaryDto>,
|
||||
/// Diagnostics grouped by decoded event category, lifecycle kind and actionability.
|
||||
pub event_classification_summaries:
|
||||
std::vec::Vec<crate::LocalEventClassificationDiagnosticSummaryDto>,
|
||||
/// Missing trade events grouped by diagnostic reason.
|
||||
pub missing_trade_event_reason_summaries:
|
||||
std::vec::Vec<crate::LocalMissingTradeEventReasonSummaryDto>,
|
||||
@@ -157,6 +166,12 @@ pub struct LocalDecodedEventDiagnosticSummaryDto {
|
||||
pub event_kind: std::string::String,
|
||||
/// Event category.
|
||||
pub event_category: std::option::Option<std::string::String>,
|
||||
/// Event lifecycle kind.
|
||||
pub event_lifecycle_kind: std::option::Option<std::string::String>,
|
||||
/// Event actionability class.
|
||||
pub event_actionability: std::option::Option<std::string::String>,
|
||||
/// Whether payload says this event is a useful non-trade event.
|
||||
pub non_trade_useful: std::option::Option<bool>,
|
||||
/// Whether payload says this event is a trade candidate.
|
||||
pub trade_candidate: std::option::Option<bool>,
|
||||
/// Whether payload says this event is a candle candidate.
|
||||
@@ -167,6 +182,27 @@ pub struct LocalDecodedEventDiagnosticSummaryDto {
|
||||
pub trade_event_count: i64,
|
||||
}
|
||||
|
||||
/// Local decoded-event classification summary.
|
||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct LocalEventClassificationDiagnosticSummaryDto {
|
||||
/// Event category.
|
||||
pub event_category: std::string::String,
|
||||
/// Event lifecycle kind.
|
||||
pub event_lifecycle_kind: std::string::String,
|
||||
/// Event actionability class.
|
||||
pub event_actionability: std::string::String,
|
||||
/// Whether payload says this event is a useful non-trade event.
|
||||
pub non_trade_useful: bool,
|
||||
/// Total decoded events in this classification group.
|
||||
pub event_count: i64,
|
||||
/// Total decoded trade candidates in this classification group.
|
||||
pub decoded_trade_candidate_count: i64,
|
||||
/// Total decoded candle candidates in this classification group.
|
||||
pub decoded_candle_candidate_count: i64,
|
||||
/// Total linked trade events in this classification group.
|
||||
pub trade_event_count: i64,
|
||||
}
|
||||
|
||||
/// Missing trade event diagnostics grouped by reason.
|
||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct LocalMissingTradeEventReasonSummaryDto {
|
||||
@@ -238,6 +274,12 @@ pub struct LocalPipelineDiagnosticCountersDto {
|
||||
pub decoded_trade_candidate_count: i64,
|
||||
/// Total decoded DEX candle candidates.
|
||||
pub decoded_candle_candidate_count: i64,
|
||||
/// Total decoded useful non-trade events.
|
||||
pub decoded_non_trade_useful_event_count: i64,
|
||||
/// Total decoded swap-like events that are intentionally non-actionable.
|
||||
pub decoded_non_actionable_trade_event_count: i64,
|
||||
/// Total decoded events with unknown classification.
|
||||
pub decoded_unknown_event_count: i64,
|
||||
/// Total decoded trade candidates without trade event, including ignored failed transactions.
|
||||
pub missing_trade_event_count: i64,
|
||||
/// Explicit alias for decoded trade candidates without linked trade event.
|
||||
@@ -289,6 +331,9 @@ pub(crate) struct LocalPipelineDiagnosticCountersRow {
|
||||
pub(crate) decoded_event_count: i64,
|
||||
pub(crate) decoded_trade_candidate_count: i64,
|
||||
pub(crate) decoded_candle_candidate_count: i64,
|
||||
pub(crate) decoded_non_trade_useful_event_count: i64,
|
||||
pub(crate) decoded_non_actionable_trade_event_count: i64,
|
||||
pub(crate) decoded_unknown_event_count: i64,
|
||||
pub(crate) missing_trade_event_count: i64,
|
||||
pub(crate) decoded_trade_candidate_without_trade_event_count: i64,
|
||||
pub(crate) decoded_trade_candidate_without_trade_event_on_ok_transaction_count: i64,
|
||||
@@ -350,12 +395,28 @@ pub(crate) struct LocalDecodedEventDiagnosticSummaryRow {
|
||||
pub(crate) protocol_name: std::string::String,
|
||||
pub(crate) event_kind: std::string::String,
|
||||
pub(crate) event_category: std::option::Option<std::string::String>,
|
||||
pub(crate) event_lifecycle_kind: std::option::Option<std::string::String>,
|
||||
pub(crate) event_actionability: std::option::Option<std::string::String>,
|
||||
pub(crate) non_trade_useful: std::option::Option<i64>,
|
||||
pub(crate) trade_candidate: std::option::Option<i64>,
|
||||
pub(crate) candle_candidate: std::option::Option<i64>,
|
||||
pub(crate) event_count: i64,
|
||||
pub(crate) trade_event_count: i64,
|
||||
}
|
||||
|
||||
/// SQL row for local decoded-event classification diagnostics.
|
||||
#[derive(Debug, Clone, sqlx::FromRow)]
|
||||
pub(crate) struct LocalEventClassificationDiagnosticSummaryRow {
|
||||
pub(crate) event_category: std::string::String,
|
||||
pub(crate) event_lifecycle_kind: std::string::String,
|
||||
pub(crate) event_actionability: std::string::String,
|
||||
pub(crate) non_trade_useful: i64,
|
||||
pub(crate) event_count: i64,
|
||||
pub(crate) decoded_trade_candidate_count: i64,
|
||||
pub(crate) decoded_candle_candidate_count: i64,
|
||||
pub(crate) trade_event_count: i64,
|
||||
}
|
||||
|
||||
/// Sample of a decoded trade candidate without linked trade event.
|
||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct LocalMissingTradeEventDiagnosticSampleDto {
|
||||
|
||||
@@ -83,6 +83,7 @@ pub use liquidity_event::query_liquidity_events_list_recent;
|
||||
pub use liquidity_event::query_liquidity_events_upsert;
|
||||
pub use local_pipeline_diagnostics::query_local_decoded_event_diagnostic_list_summaries;
|
||||
pub use local_pipeline_diagnostics::query_local_duplicate_decoded_event_trade_diagnostic_list_samples;
|
||||
pub use local_pipeline_diagnostics::query_local_event_classification_diagnostic_list_summaries;
|
||||
pub use local_pipeline_diagnostics::query_local_missing_trade_event_diagnostic_list_samples;
|
||||
pub use local_pipeline_diagnostics::query_local_missing_trade_event_reason_list_summaries;
|
||||
pub use local_pipeline_diagnostics::query_local_multi_trade_signature_pair_diagnostic_list_samples;
|
||||
|
||||
@@ -26,6 +26,28 @@ SELECT
|
||||
FROM k_sol_dex_decoded_events
|
||||
WHERE json_extract(payload_json, '$.candleCandidate') = 1
|
||||
) AS decoded_candle_candidate_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM k_sol_dex_decoded_events
|
||||
WHERE COALESCE(json_extract(payload_json, '$.nonTradeUseful'), 0) = 1
|
||||
OR COALESCE(json_extract(payload_json, '$.eventActionability'), '') = 'non_trade_useful'
|
||||
) AS decoded_non_trade_useful_event_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM k_sol_dex_decoded_events
|
||||
WHERE COALESCE(json_extract(payload_json, '$.eventActionability'), '') = 'non_actionable_trade'
|
||||
OR (
|
||||
COALESCE(json_extract(payload_json, '$.eventActionability'), '') = ''
|
||||
AND COALESCE(json_extract(payload_json, '$.eventCategory'), '') = 'trade'
|
||||
AND COALESCE(json_extract(payload_json, '$.tradeCandidate'), 0) = 0
|
||||
AND COALESCE(json_extract(payload_json, '$.transactionFailed'), 0) = 0
|
||||
)
|
||||
) AS decoded_non_actionable_trade_event_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM k_sol_dex_decoded_events
|
||||
WHERE COALESCE(json_extract(payload_json, '$.eventCategory'), 'unknown') = 'unknown'
|
||||
) AS decoded_unknown_event_count,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM k_sol_dex_decoded_events dde
|
||||
@@ -250,6 +272,10 @@ SELECT
|
||||
decoded_event_count: row.decoded_event_count,
|
||||
decoded_trade_candidate_count: row.decoded_trade_candidate_count,
|
||||
decoded_candle_candidate_count: row.decoded_candle_candidate_count,
|
||||
decoded_non_trade_useful_event_count: row.decoded_non_trade_useful_event_count,
|
||||
decoded_non_actionable_trade_event_count: row
|
||||
.decoded_non_actionable_trade_event_count,
|
||||
decoded_unknown_event_count: row.decoded_unknown_event_count,
|
||||
missing_trade_event_count: row.missing_trade_event_count,
|
||||
decoded_trade_candidate_without_trade_event_count: row
|
||||
.decoded_trade_candidate_without_trade_event_count,
|
||||
@@ -512,6 +538,9 @@ SELECT
|
||||
dde.protocol_name AS protocol_name,
|
||||
dde.event_kind AS event_kind,
|
||||
json_extract(dde.payload_json, '$.eventCategory') AS event_category,
|
||||
json_extract(dde.payload_json, '$.eventLifecycleKind') AS event_lifecycle_kind,
|
||||
json_extract(dde.payload_json, '$.eventActionability') AS event_actionability,
|
||||
json_extract(dde.payload_json, '$.nonTradeUseful') AS non_trade_useful,
|
||||
json_extract(dde.payload_json, '$.tradeCandidate') AS trade_candidate,
|
||||
json_extract(dde.payload_json, '$.candleCandidate') AS candle_candidate,
|
||||
COUNT(dde.id) AS event_count,
|
||||
@@ -522,6 +551,9 @@ GROUP BY
|
||||
dde.protocol_name,
|
||||
dde.event_kind,
|
||||
event_category,
|
||||
event_lifecycle_kind,
|
||||
event_actionability,
|
||||
non_trade_useful,
|
||||
trade_candidate,
|
||||
candle_candidate
|
||||
ORDER BY
|
||||
@@ -546,6 +578,9 @@ ORDER BY
|
||||
protocol_name: row.protocol_name,
|
||||
event_kind: row.event_kind,
|
||||
event_category: row.event_category,
|
||||
event_lifecycle_kind: row.event_lifecycle_kind,
|
||||
event_actionability: row.event_actionability,
|
||||
non_trade_useful: sqlite_bool_to_option(row.non_trade_useful),
|
||||
trade_candidate: sqlite_bool_to_option(row.trade_candidate),
|
||||
candle_candidate: sqlite_bool_to_option(row.candle_candidate),
|
||||
event_count: row.event_count,
|
||||
@@ -557,6 +592,68 @@ ORDER BY
|
||||
}
|
||||
}
|
||||
|
||||
/// Lists local decoded-event classification diagnostic summaries.
|
||||
pub async fn query_local_event_classification_diagnostic_list_summaries(
|
||||
database: &crate::Database,
|
||||
) -> Result<std::vec::Vec<crate::LocalEventClassificationDiagnosticSummaryDto>, crate::Error> {
|
||||
match database.connection() {
|
||||
crate::DatabaseConnection::Sqlite(pool) => {
|
||||
let rows_result = sqlx::query_as::<
|
||||
sqlx::Sqlite,
|
||||
crate::db::dtos::LocalEventClassificationDiagnosticSummaryRow,
|
||||
>(
|
||||
r#"
|
||||
SELECT
|
||||
COALESCE(json_extract(dde.payload_json, '$.eventCategory'), 'unknown') AS event_category,
|
||||
COALESCE(json_extract(dde.payload_json, '$.eventLifecycleKind'), 'unknown') AS event_lifecycle_kind,
|
||||
COALESCE(json_extract(dde.payload_json, '$.eventActionability'), 'unknown') AS event_actionability,
|
||||
CASE WHEN COALESCE(json_extract(dde.payload_json, '$.nonTradeUseful'), 0) = 1 THEN 1 ELSE 0 END AS non_trade_useful,
|
||||
COUNT(dde.id) AS event_count,
|
||||
COUNT(CASE WHEN COALESCE(json_extract(dde.payload_json, '$.tradeCandidate'), 0) = 1 THEN dde.id END) AS decoded_trade_candidate_count,
|
||||
COUNT(CASE WHEN COALESCE(json_extract(dde.payload_json, '$.candleCandidate'), 0) = 1 THEN dde.id END) AS decoded_candle_candidate_count,
|
||||
COUNT(te.id) AS trade_event_count
|
||||
FROM k_sol_dex_decoded_events dde
|
||||
LEFT JOIN k_sol_trade_events te ON te.decoded_event_id = dde.id
|
||||
GROUP BY
|
||||
event_category,
|
||||
event_lifecycle_kind,
|
||||
event_actionability,
|
||||
non_trade_useful
|
||||
ORDER BY
|
||||
event_category,
|
||||
event_lifecycle_kind,
|
||||
event_actionability
|
||||
"#,
|
||||
)
|
||||
.fetch_all(pool)
|
||||
.await;
|
||||
let rows = match rows_result {
|
||||
Ok(rows) => rows,
|
||||
Err(error) => {
|
||||
return Err(crate::Error::Db(format!(
|
||||
"cannot list local decoded event classification summaries on sqlite: {}",
|
||||
error
|
||||
)));
|
||||
},
|
||||
};
|
||||
let mut summaries = std::vec::Vec::new();
|
||||
for row in rows {
|
||||
summaries.push(crate::LocalEventClassificationDiagnosticSummaryDto {
|
||||
event_category: row.event_category,
|
||||
event_lifecycle_kind: row.event_lifecycle_kind,
|
||||
event_actionability: row.event_actionability,
|
||||
non_trade_useful: row.non_trade_useful != 0,
|
||||
event_count: row.event_count,
|
||||
decoded_trade_candidate_count: row.decoded_trade_candidate_count,
|
||||
decoded_candle_candidate_count: row.decoded_candle_candidate_count,
|
||||
trade_event_count: row.trade_event_count,
|
||||
});
|
||||
}
|
||||
return Ok(summaries);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/// Lists missing trade events grouped by diagnostic reason.
|
||||
pub async fn query_local_missing_trade_event_reason_list_summaries(
|
||||
database: &crate::Database,
|
||||
|
||||
Reference in New Issue
Block a user