AppEvent.cs 9.2 KB

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