trace_stack.rs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. use std::fmt;
  2. use std::fmt::{Formatter};
  3. use chrono::Utc;
  4. use rust_decimal::prelude::ToPrimitive;
  5. #[derive(Debug, Clone, PartialEq, Eq)]
  6. pub struct TraceStack {
  7. pub before_network: i64, // 官方数据生成时间
  8. pub after_network: i64, // 到达网络层时间
  9. pub before_unlock_quant: i64, // 解锁quant之前的时间
  10. pub before_quant: i64, // quant层执行开始时间(也是通道+锁走完后的时间)
  11. pub after_quant: i64, // quant层执行结束时间
  12. pub before_format: i64, // 开始格式化时间
  13. pub after_format: i64, // 结束格式化时间
  14. pub before_strategy: i64, // 计算层开始时间
  15. pub after_strategy: i64, // 计算层结束时间
  16. pub before_send_thread: i64, // 发送指令时时间(进入协程前)
  17. pub before_send: i64, // 发送指令时时间(进入协程后)
  18. pub after_send: i64, // 发送指令结束时间
  19. pub source: String, // 订单来源[depth|order]
  20. pub order_command: String // 订单发送时的command
  21. }
  22. impl TraceStack {
  23. pub fn on_before_network(&mut self, before_network_millis: i64) {
  24. self.before_network = before_network_millis;
  25. }
  26. pub fn on_after_network(&mut self, after_network: i64) {
  27. self.after_network = after_network;
  28. }
  29. pub fn on_before_unlock_quant(&mut self) {
  30. self.before_unlock_quant = Utc::now().timestamp_micros();
  31. }
  32. pub fn on_before_quant(&mut self) {
  33. self.before_quant = Utc::now().timestamp_micros();
  34. }
  35. pub fn on_after_quant(&mut self) {
  36. self.after_quant = Utc::now().timestamp_micros();
  37. }
  38. pub fn on_before_format(&mut self) {
  39. self.before_format = Utc::now().timestamp_micros();
  40. }
  41. pub fn on_after_format(&mut self) {
  42. self.after_format = Utc::now().timestamp_micros();
  43. }
  44. pub fn on_before_strategy(&mut self) {
  45. self.before_strategy = Utc::now().timestamp_micros();
  46. }
  47. pub fn on_after_strategy(&mut self) {
  48. self.after_strategy = Utc::now().timestamp_micros();
  49. }
  50. pub fn on_before_send_thread(&mut self) {
  51. self.before_send_thread = Utc::now().timestamp_micros();
  52. }
  53. pub fn on_before_send(&mut self) {
  54. self.before_send = Utc::now().timestamp_micros();
  55. }
  56. pub fn on_after_send(&mut self) {
  57. self.after_send = Utc::now().timestamp_micros();
  58. }
  59. pub fn on_depth(&mut self) {
  60. self.source = "depth".to_string();
  61. }
  62. pub fn on_order(&mut self) {
  63. self.source = "order".to_string();
  64. }
  65. pub fn on_order_command(&mut self, command_str: String) {
  66. self.order_command = command_str;
  67. }
  68. pub fn on_special(mut self, event_str: String) -> Self {
  69. self.after_network = 1;
  70. self.source = event_str;
  71. self
  72. }
  73. }
  74. impl fmt::Display for TraceStack {
  75. fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  76. let mut msg = String::new();
  77. if !self.source.is_empty() {
  78. msg.push_str(format!("订单来源:{} ", self.source).as_str());
  79. }
  80. if self.after_network != 0 && self.before_send != 0 {
  81. msg.push_str(format!("本地总耗时{}微秒 ", self.before_send - self.after_network).as_str());
  82. }
  83. if self.before_network != 0 && self.after_network != 0 {
  84. msg.push_str(format!("数据生成+到达rust耗时{}毫秒 ", (self.after_network - self.before_network).to_f64().unwrap() / 1000.0).as_str());
  85. }
  86. if self.before_unlock_quant != 0 && self.after_network != 0 {
  87. msg.push_str(format!("数据通道耗时{}微秒 ", self.before_unlock_quant - self.after_network).as_str());
  88. }
  89. if self.before_quant != 0 && self.before_unlock_quant != 0 {
  90. msg.push_str(format!("解锁quant{}微秒 ", self.before_quant - self.before_unlock_quant).as_str());
  91. }
  92. if self.after_format != 0 && self.before_format != 0 {
  93. msg.push_str(format!("数据格式化耗时{}微秒 ", self.after_format - self.before_format).as_str());
  94. }
  95. if self.after_quant != 0 && self.before_quant != 0 {
  96. msg.push_str(format!("quant执行耗时{}微秒 ", self.after_quant - self.before_quant).as_str());
  97. }
  98. if self.after_strategy != 0 && self.before_strategy != 0 {
  99. msg.push_str(format!("计算层执行耗时{}微秒 ", self.after_strategy - self.before_strategy).as_str());
  100. }
  101. if self.after_network != 0 && self.after_strategy != 0 {
  102. msg.push_str(format!("quant走完{}微秒 ", self.after_strategy - self.after_network).as_str());
  103. }
  104. if self.before_send != 0 && self.before_send_thread != 0 {
  105. msg.push_str(format!("进入发单协程耗时{}微秒 ", self.before_send - self.before_send_thread).as_str());
  106. }
  107. if self.after_send != 0 && self.before_send != 0 {
  108. msg.push_str(format!("发送订单耗时(发送-服务器处理-响应到本地){}毫秒 ", (self.after_send - self.before_send).to_f64().unwrap() / 1000.0).as_str());
  109. }
  110. if self.after_send != 0 && self.after_network != 0 {
  111. msg.push_str(format!("总共耗时{}毫秒", (self.after_send - self.after_network).to_f64().unwrap() / 1000.0).as_str());
  112. }
  113. write!(f, "{}", msg)
  114. }
  115. }
  116. impl Default for TraceStack {
  117. fn default() -> Self {
  118. TraceStack {
  119. before_network: 0,
  120. after_network: 0,
  121. before_format: 0,
  122. after_format: 0,
  123. before_unlock_quant: 0,
  124. before_quant: 0,
  125. after_quant: 0,
  126. before_strategy: 0,
  127. after_strategy: 0,
  128. before_send_thread: 0,
  129. before_send: 0,
  130. after_send: 0,
  131. source: "".to_string(),
  132. order_command: "".to_string(),
  133. }
  134. }
  135. }