lith 3 년 전
부모
커밋
3cdc9aba35

+ 9 - 7
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/ApiTrace/Collector/SplunkCollector.cs

@@ -99,18 +99,20 @@ namespace Sers.Core.Module.ApiTrace.Collector
 
 
         #region BuildEventData    
-        public static JObject BuildEventData(object traceData, RpcContextData rpcData, ApiMessage apiRequestMessage, Func<ApiMessage> GetApiReplyMessage, IDictionary<string, string> tagsTemplate)
+        public static JObject BuildEventData(object beginTime, RpcContextData rpcData, ApiMessage apiRequestMessage, Func<ApiMessage> GetApiReplyMessage, IDictionary<string, string> tagsTemplate)
         {
-            var beginTime = (DateTime)traceData;
-
-            var endTime = DateTime.Now;
 
             JObject eventData = new JObject();
             eventData["level"] = "ApiTrace";
 
-            eventData["beginTime"] = beginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
-            eventData["endTime"] = endTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
-            eventData["duration"] = (endTime - beginTime).TotalMilliseconds;
+            if (beginTime is DateTime _beginTime) 
+            {
+                var endTime = DateTime.Now;
+
+                eventData["beginTime"] = _beginTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
+                eventData["endTime"] = endTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
+                eventData["duration"] = (endTime - _beginTime).TotalMilliseconds;
+            }
 
 
             #region method getTagValue

+ 1 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/ApiTrace/Collector/TxtCollector.cs

@@ -53,7 +53,7 @@ namespace Sers.Core.Module.ApiTrace.Collector
             msg.Append(Environment.NewLine).Append("--duration :").Append((endTime - beginTime).TotalMilliseconds).Append(" ms");
 
 
-            JObject eventData = SplunkCollector.BuildEventData(traceData, rpcData, apiRequestMessage, GetApiReplyMessage, tagsTemplate);
+            JObject eventData = SplunkCollector.BuildEventData(null, rpcData, apiRequestMessage, GetApiReplyMessage, tagsTemplate);
             foreach (var kv in eventData)
             {
                 var key = kv.Key;

+ 11 - 10
dotnet/Library/Vit/Vit.Core/Vit.Core/Module/Log/LogCollector/Vit.Logger.appsettings.json

@@ -1,5 +1,4 @@
 {
-
   /* Vit工具配置,可不指定 */
   "Vit": {
 
@@ -10,6 +9,10 @@
       /* print the log to console. default:true  */
       "PrintToConsole": true,
 
+
+      /* print the error happened in log module to console. default:false  */
+      "PrintLogErrorToConsole": false,
+
       /* [optional]collector to send log to */
       "Collector": [
         {
@@ -18,22 +21,22 @@
           /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
           //"className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
 
-          "client": {
+          "server": {
             "url": "https://192.168.20.20:8088/services/collector",
             "authToken": "xxxxx",
+            "index": "dev",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
             "//intervalMs": 2000
           },
 
-          "message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:mc",
             "sourcetype": "httpevent"
           },
 
           //custome object
-          "appInfo": {
+          "//appInfo": {
             "namespace": "sers.cloud",
             "appName": "mc",
             "moduleName": "ServiceCenter"
@@ -44,13 +47,13 @@
           /* 在此Assembly中加载类 */
           "assemblyFile": "Vit.Core.dll",
           /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
-          //"className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",
+          "className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",
 
-          "client": {
+          "server": {
             // es address, example:"http://192.168.20.20:9200"
             "url": "http://192.168.20.20:9200",
             //es index, example:"dev"
-            "index": "dev",
+            "index": "dev_log",
             //es type, example:"_doc"
             //"type": "_doc",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
@@ -67,7 +70,5 @@
         }
       ]
     }
-
   }
-
 }

+ 82 - 9
dotnet/ServiceCenter/App.ServiceCenter/appsettings.json

@@ -456,15 +456,15 @@
           //"className": "Sers.Core.Module.ApiTrace.Collector.SplunkCollector",
 
 
-          "client": {
+          "server": {
             "url": "http://192.168.20.20:8088/services/collector",
             "authToken": "xxxxx",
+            "index": "dev",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
             "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:sers",
             "sourcetype": "sers-ApiTrace"
@@ -478,6 +478,54 @@
             //,"...": {}
           },
 
+          "tags": {
+            // 可为 requestRpc requestData responseRpc responseData
+            "route": "{{requestRpc.route}}",
+            //"{{requestRpc.route}}": "route",
+
+            "url": "{{requestRpc.http.url}}",
+            "method": "{{requestRpc.http.method}}",
+            "requestRpc": "{{requestRpc}}",
+            "requestData": "{{requestData}}",
+
+            "responseRpc": "{{responseRpc}}",
+            "responseState": "{{responseRpc.http.headers.responseState}}",
+            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"
+
+            "responseData": "{{responseData}}",
+            "responseData.error": "{{responseData.error}}"
+          }
+        },
+        { //搜集ApiTrace到 ElasticSearch
+
+          /* 搜集器名称(ApiTrace推送端根据此名称推送到对应的搜集器),若不指定则不加载 */
+          "collectorName": "default",
+
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Sers.Core.dll",
+          /* 动态加载的类名,必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
+          //"className": "Sers.Core.Module.ApiTrace.Collector.ElasticSearchCollector",
+
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_apiTrace",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "//appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "ServiceCenter"
+            //,"...": {}
+          },
+
           "//tags": {
             // 可为 requestRpc requestData responseRpc responseData
             "route": "{{requestRpc.route}}",
@@ -677,22 +725,22 @@
       "PrintToConsole": true,
 
       /* [optional]collector to send log to */
-      "//Collector": [
+      "Collector": [
         {
           /* 在此Assembly中加载类 */
           "assemblyFile": "Vit.Core.dll",
           /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
-          "className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
+          //"className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
 
-          "client": {
-            "url": "http://192.168.20.20:8088/services/collector",
+          "server": {
+            "url": "https://192.168.20.20:8088/services/collector",
             "authToken": "xxxxx",
+            "index": "dev",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
             "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:mc",
             "sourcetype": "httpevent"
@@ -705,6 +753,31 @@
             "moduleName": "ServiceCenter"
             //,"...": {}
           }
+        },
+        {
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Vit.Core.dll",
+          /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
+          "className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_log",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "ServiceCenter"
+            //,"...": {}
+          }
         }
       ]
     },

+ 7 - 128
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ApiTrace.Collector.Zipkin/ZipKinCollector.cs

@@ -120,139 +120,18 @@ namespace Sers.ApiTrace.Collector.Zipkin
             //catch
             //{
             //}
-            #endregion
-
-            #region method getTagValue
-
-            string requestRpc_oriString = null;
-            JObject requestRpc_json = null;
-
-            string requestData_oriString = null;
-            JObject requestData_json = null;
+            #endregion 
 
-            ApiMessage apiResponseMessage = null;
-
-            string responseRpc_oriString = null;
-            JObject responseRpc_json = null;
-
-            string responseData_oriString = null;
-            JObject responseData_json = null;
-
-            string GetTagValue(string valueString)
+            JObject eventData = SplunkCollector.BuildEventData(null, rpcData, apiRequestMessage, GetApiReplyMessage, config.tags);
+            foreach (var kv in eventData)
             {
-                if (string.IsNullOrEmpty(valueString)) return null;
-                if (!valueString.StartsWith("{{") || !valueString.EndsWith("}}")) return valueString;
-
-                try
-                {
-
-                    valueString = valueString.Substring(2, valueString.Length - 4);
-
-                    string dataType;
-                    string path;
-
-                    var splitIndex = valueString.IndexOf('.');
-                    if (splitIndex < 0)
-                    {
-                        dataType = valueString;
-                        path = "";
-                    }
-                    else
-                    {
-                        dataType = valueString.Substring(0, splitIndex);
-                        path = valueString.Substring(splitIndex + 1);
-                    }
-
-                    switch (dataType)
-                    {
-                        case "requestRpc":
-
-                            if (requestRpc_oriString == null)
-                            {
-                                requestRpc_oriString = apiRequestMessage.rpcContextData_OriData.ArraySegmentByteToString();
-                            }
-                            if (string.IsNullOrEmpty(path))
-                            {
-                                return requestRpc_oriString;
-                            }
-                            if (requestRpc_json == null)
-                            {
-                                requestRpc_json = requestRpc_oriString.Deserialize<JObject>();
-                            }
-                            return requestRpc_json?.SelectToken(path).ConvertToString();
-
-                        case "requestData":
-                            if (requestData_oriString == null)
-                            {
-                                requestData_oriString = apiRequestMessage.value_OriData.ArraySegmentByteToString();
-                            }
-                            if (string.IsNullOrEmpty(path))
-                            {
-                                return requestData_oriString;
-                            }
-                            if (requestData_json == null)
-                            {
-                                requestData_json = requestData_oriString.Deserialize<JObject>();
-                            }
-                            return requestData_json?.SelectToken(path).ConvertToString();
-
-                        case "responseRpc":
-                            if (apiResponseMessage == null)
-                            {
-                                apiResponseMessage = GetApiReplyMessage();
-                            }
-                            if (responseRpc_oriString == null)
-                            {
-                                responseRpc_oriString = apiResponseMessage.rpcContextData_OriData.ArraySegmentByteToString();
-                            }
-                            if (string.IsNullOrEmpty(path))
-                            {
-                                return responseRpc_oriString;
-                            }
-                            if (responseRpc_json == null)
-                            {
-                                responseRpc_json = responseRpc_oriString.Deserialize<JObject>();
-                            }
-                            return responseRpc_json?.SelectToken(path).ConvertToString();
-
-                        case "responseData":
-                            if (apiResponseMessage == null)
-                            {
-                                apiResponseMessage = GetApiReplyMessage();
-                            }
-                            if (responseData_oriString == null)
-                            {
-                                responseData_oriString = apiResponseMessage.value_OriData.ArraySegmentByteToString();
-                            }
-                            if (string.IsNullOrEmpty(path))
-                            {
-                                return responseData_oriString;
-                            }
-                            if (responseData_json == null)
-                            {
-                                responseData_json = responseData_oriString.Deserialize<JObject>();
-                            }
-                            return responseData_json?.SelectToken(path).ConvertToString();
-                    }
-                }
-                catch
-                {
-                }
-                return null;
-            }
-            #endregion
-
-            //tags
-            config.tags?.IEnumerable_ForEach(item =>
-            {
-                var key = GetTagValue(item.Key);
-                var value = GetTagValue(item.Value);
+                var key = kv.Key;
+                var value = kv.Value;
                 if (key != null && value != null)
                 {
-                    trace.Record(Annotations.Tag(key, value));
+                    trace.Record(Annotations.Tag(key, value.ConvertToString()));
                 }
-            });
-
+            }
 
             trace.Record(Annotations.ClientRecv());
         }

+ 83 - 10
dotnet/ServiceStation/Demo/SersLoader/Did.SersLoader.Demo/appsettings.json

@@ -389,15 +389,15 @@
           //"className": "Sers.Core.Module.ApiTrace.Collector.SplunkCollector",
 
 
-          "client": {
+          "server": {
             "url": "http://192.168.20.20:8088/services/collector",
             "authToken": "xxxxx",
+            "index": "dev",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
             "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:sers",
             "sourcetype": "sers-ApiTrace"
@@ -411,6 +411,54 @@
             //,"...": {}
           },
 
+          "tags": {
+            // 可为 requestRpc requestData responseRpc responseData
+            "route": "{{requestRpc.route}}",
+            //"{{requestRpc.route}}": "route",
+
+            "url": "{{requestRpc.http.url}}",
+            "method": "{{requestRpc.http.method}}",
+            "requestRpc": "{{requestRpc}}",
+            "requestData": "{{requestData}}",
+
+            "responseRpc": "{{responseRpc}}",
+            "responseState": "{{responseRpc.http.headers.responseState}}",
+            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"
+
+            "responseData": "{{responseData}}",
+            "responseData.error": "{{responseData.error}}"
+          }
+        },
+        { //搜集ApiTrace到 ElasticSearch
+
+          /* 搜集器名称(ApiTrace推送端根据此名称推送到对应的搜集器),若不指定则不加载 */
+          "collectorName": "default",
+
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Sers.Core.dll",
+          /* 动态加载的类名,必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
+          //"className": "Sers.Core.Module.ApiTrace.Collector.ElasticSearchCollector",
+
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_apiTrace",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "//appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "demo"
+            //,"...": {}
+          },
+
           "//tags": {
             // 可为 requestRpc requestData responseRpc responseData
             "route": "{{requestRpc.route}}",
@@ -469,22 +517,22 @@
       "PrintToConsole": true,
 
       /* [optional]collector to send log to */
-      "//Collector": [
+      "Collector": [
         {
           /* 在此Assembly中加载类 */
           "assemblyFile": "Vit.Core.dll",
           /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
-          "className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
+          //"className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
 
-          "client": {
-            "url": "http://192.168.20.20:8088/services/collector",
+          "server": {
+            "url": "https://192.168.20.20:8088/services/collector",
             "authToken": "xxxxx",
+            "index": "dev",
             //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
             "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:mc",
             "sourcetype": "httpevent"
@@ -494,7 +542,32 @@
           "//appInfo": {
             "namespace": "sers.cloud",
             "appName": "mc",
-            "moduleName": "ServiceCenter"
+            "moduleName": "demo"
+            //,"...": {}
+          }
+        },
+        {
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Vit.Core.dll",
+          /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
+          "className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_log",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "demo"
             //,"...": {}
           }
         }

+ 89 - 12
dotnet/ServiceStation/Demo/Serslot/Did.Serslot.Demo/appsettings.json

@@ -267,13 +267,15 @@
           //"className": "Sers.Core.Module.ApiTrace.Collector.SplunkCollector",
 
 
-          "client": {
+          "server": {
             "url": "http://192.168.20.20:8088/services/collector",
-            "authToken": "xxxxx"
+            "authToken": "xxxxx",
+            "index": "dev",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:sers",
             "sourcetype": "sers-ApiTrace"
@@ -287,6 +289,54 @@
             //,"...": {}
           },
 
+          "tags": {
+            // 可为 requestRpc requestData responseRpc responseData
+            "route": "{{requestRpc.route}}",
+            //"{{requestRpc.route}}": "route",
+
+            "url": "{{requestRpc.http.url}}",
+            "method": "{{requestRpc.http.method}}",
+            "requestRpc": "{{requestRpc}}",
+            "requestData": "{{requestData}}",
+
+            "responseRpc": "{{responseRpc}}",
+            "responseState": "{{responseRpc.http.headers.responseState}}",
+            //"responseError_Base64": "{{responseRpc.http.headers.responseError_Base64}}"
+
+            "responseData": "{{responseData}}",
+            "responseData.error": "{{responseData.error}}"
+          }
+        },
+        { //搜集ApiTrace到 ElasticSearch
+
+          /* 搜集器名称(ApiTrace推送端根据此名称推送到对应的搜集器),若不指定则不加载 */
+          "collectorName": "default",
+
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Sers.Core.dll",
+          /* 动态加载的类名,必须继承接口 Sers.Core.Module.ApiTrace.Collector.IApiTraceCollector */
+          //"className": "Sers.Core.Module.ApiTrace.Collector.ElasticSearchCollector",
+
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_apiTrace",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "//appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "demo"
+            //,"...": {}
+          },
+
           "//tags": {
             // 可为 requestRpc requestData responseRpc responseData
             "route": "{{requestRpc.route}}",
@@ -320,20 +370,22 @@
       "PrintToConsole": true,
 
       /* [optional]collector to send log to */
-      "//Collector": [
+      "Collector": [
         {
           /* 在此Assembly中加载类 */
           "assemblyFile": "Vit.Core.dll",
           /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
-          "className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
+          //"className": "Vit.Core.Module.Log.LogCollector.Splunk.SplunkCollector",
 
-          "client": {
-            "url": "http://192.168.20.20:8088/services/collector",
-            "authToken": "xxxxx"
+          "server": {
+            "url": "https://192.168.20.20:8088/services/collector",
+            "authToken": "xxxxx",
+            "index": "dev",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
           },
 
-          "//message": {
-            "index": "dev",
+          "//hostInfo": {
             "host": "192.168.20.20:8088",
             "source": "http:mc",
             "sourcetype": "httpevent"
@@ -343,7 +395,32 @@
           "//appInfo": {
             "namespace": "sers.cloud",
             "appName": "mc",
-            "moduleName": "ServiceCenter"
+            "moduleName": "demo"
+            //,"...": {}
+          }
+        },
+        {
+          /* 在此Assembly中加载类 */
+          "assemblyFile": "Vit.Core.dll",
+          /* 动态加载的类名,必须继承接口 Vit.Core.Module.Log.LogCollector.ILogCollector */
+          "className": "Vit.Core.Module.Log.LogCollector.ElasticSearch.ElasticSearchCollector",
+
+          "server": {
+            // es address, example:"http://192.168.20.20:9200"
+            "url": "http://192.168.20.20:9200",
+            //es index, example:"dev"
+            "index": "dev_log",
+            //es type, example:"_doc"
+            //"type": "_doc",
+            //若指定则在指定时间间隔统一推送数据,若不指定则立即推送。单位:ms
+            "//intervalMs": 2000
+          },
+
+          //custome object
+          "appInfo": {
+            "namespace": "sers.cloud",
+            "appName": "mc",
+            "moduleName": "demo"
             //,"...": {}
           }
         }