AppEvent.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using Newtonsoft.Json.Linq;
  2. using Sers.Core.Module.App.AppEvent;
  3. using Sers.Core.Module.Message;
  4. using Sers.Core.Module.Rpc;
  5. using Sers.Gover.Base;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Text;
  9. using Vit.Core.Module.Log;
  10. using Vit.Extensions;
  11. namespace Sers.Gover.Apm.Txt
  12. {
  13. public class AppEvent : IAppEvent
  14. {
  15. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
  16. Action<Object, Vit.Core.Util.Pipelines.ByteData> ApiScopeEvent(RpcContextData rpcData, ApiMessage apiRequestMessage)
  17. {
  18. //记录请求数据
  19. var beginTime = DateTime.Now;
  20. return (s, apiReplyMessage) => {
  21. var endTime = DateTime.Now;
  22. #region method getTagValue
  23. string requestRpc_oriString = null;
  24. JObject requestRpc_json = null;
  25. string requestData_oriString = null;
  26. JObject requestData_json = null;
  27. ApiMessage apiResponseMessage = null;
  28. string responseRpc_oriString = null;
  29. JObject responseRpc_json = null;
  30. string responseData_oriString = null;
  31. JObject responseData_json = null;
  32. string GetTagValue(string valueString)
  33. {
  34. if (string.IsNullOrEmpty(valueString)) return null;
  35. if (!valueString.StartsWith("{{") || !valueString.EndsWith("}}")) return valueString;
  36. try
  37. {
  38. valueString = valueString.Substring(2, valueString.Length - 4);
  39. string dataType;
  40. string path;
  41. var splitIndex = valueString.IndexOf('.');
  42. if (splitIndex < 0)
  43. {
  44. dataType = valueString;
  45. path = "";
  46. }
  47. else
  48. {
  49. dataType = valueString.Substring(0, splitIndex);
  50. path = valueString.Substring(splitIndex + 1);
  51. }
  52. switch (dataType)
  53. {
  54. case "requestRpc":
  55. if (requestRpc_oriString == null)
  56. {
  57. requestRpc_oriString = apiRequestMessage.rpcContextData_OriData.ArraySegmentByteToString();
  58. }
  59. if (string.IsNullOrEmpty(path))
  60. {
  61. return requestRpc_oriString;
  62. }
  63. if (requestRpc_json == null)
  64. {
  65. requestRpc_json = requestRpc_oriString.Deserialize<JObject>();
  66. }
  67. return requestRpc_json?.SelectToken(path).ConvertToString();
  68. case "requestData":
  69. if (requestData_oriString == null)
  70. {
  71. requestData_oriString = apiRequestMessage.value_OriData.ArraySegmentByteToString();
  72. }
  73. if (string.IsNullOrEmpty(path))
  74. {
  75. return requestData_oriString;
  76. }
  77. if (requestData_json == null)
  78. {
  79. requestData_json = requestData_oriString.Deserialize<JObject>();
  80. }
  81. return requestData_json?.SelectToken(path).ConvertToString();
  82. case "responseRpc":
  83. if (apiResponseMessage == null)
  84. {
  85. apiResponseMessage = new ApiMessage();
  86. apiResponseMessage.Unpack(apiReplyMessage.ToArraySegment());
  87. }
  88. if (responseRpc_oriString == null)
  89. {
  90. responseRpc_oriString = apiResponseMessage.rpcContextData_OriData.ArraySegmentByteToString();
  91. }
  92. if (string.IsNullOrEmpty(path))
  93. {
  94. return responseRpc_oriString;
  95. }
  96. if (responseRpc_json == null)
  97. {
  98. responseRpc_json = responseRpc_oriString.Deserialize<JObject>();
  99. }
  100. return responseRpc_json?.SelectToken(path).ConvertToString();
  101. case "responseData":
  102. if (apiResponseMessage == null)
  103. {
  104. apiResponseMessage = new ApiMessage();
  105. apiResponseMessage.Unpack(apiReplyMessage.ToArraySegment());
  106. }
  107. if (responseData_oriString == null)
  108. {
  109. responseData_oriString = apiResponseMessage.value_OriData.ArraySegmentByteToString();
  110. }
  111. if (string.IsNullOrEmpty(path))
  112. {
  113. return responseData_oriString;
  114. }
  115. if (responseData_json == null)
  116. {
  117. responseData_json = responseData_oriString.Deserialize<JObject>();
  118. }
  119. return responseData_json?.SelectToken(path).ConvertToString();
  120. }
  121. }
  122. catch
  123. {
  124. }
  125. return null;
  126. }
  127. #endregion
  128. StringBuilder msg = new StringBuilder();
  129. msg.Append(Environment.NewLine).Append("┍------------ ---------┑");
  130. msg.Append(Environment.NewLine).Append("--BeginTime:").Append(beginTime.ToString("[HH:mm:ss.ffffff]"));
  131. msg.Append(Environment.NewLine).Append("--EndTime :").Append(endTime.ToString("[HH:mm:ss.ffffff]"));
  132. msg.Append(Environment.NewLine).Append("--duration :").Append((endTime - beginTime).TotalMilliseconds).Append(" ms");
  133. config.tags?.IEnumerable_ForEach(item =>
  134. {
  135. //try
  136. //{
  137. var key = GetTagValue(item.Key);
  138. var value = GetTagValue(item.Value);
  139. if (key != null)
  140. {
  141. msg.Append(Environment.NewLine).Append("--" + key + ":").Append(value);
  142. }
  143. //}
  144. //catch
  145. //{
  146. //}
  147. });
  148. msg.Append(Environment.NewLine).Append("┕------------ ---------┙").Append(Environment.NewLine);
  149. Logger.log.LogTxt(Level.ApiTrace, msg.ToString());
  150. };
  151. }
  152. public void InitEvent(JObject arg)
  153. {
  154. config = arg.Deserialize<Config>();
  155. Logger.Info("[Sers.Gover.Apm.Txt]初始化中... ");
  156. }
  157. Config config;
  158. public void BeforeStart()
  159. {
  160. if (config == null) return;
  161. GoverApiCenterService.Instance.AddApiScopeEvent(ApiScopeEvent);
  162. Logger.Info("[Sers.Gover.Apm.Txt]初始化成功");
  163. }
  164. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
  165. public void OnStart()
  166. {
  167. }
  168. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
  169. public void AfterStart()
  170. {
  171. }
  172. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
  173. public void BeforeStop()
  174. {
  175. }
  176. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
  177. public void AfterStop()
  178. {
  179. }
  180. }
  181. #region Config Model
  182. class Config
  183. {
  184. public IDictionary<string, string> tags;
  185. }
  186. #endregion
  187. }