public Task Add(string ip, ConcurrentBag <byte[]> data) { return(Task.Run(() => { //设置一个接收阀值 var queueCount = datas.Count(); if (queueCount < ReceivingThreshold) { var etwData = new EtwData { guid = Guid.NewGuid().ToString(), buffList = data, enumEtwStatus = EnumEtwStatus.None, time = DateTime.Now.Ticks, retryCount = 0, senderIp = ip, }; datas.Enqueue(etwData); } else { //logger.Debug(JsonConvert.SerializeObject( // $"EtwData Add more than max=[{ReceivingThreshold}]" //)); } })); }
private List <CloudflareLog> ParseEtwData(EtwData data) { List <CloudflareLog> cloudflareLogs = new List <CloudflareLog>(); //ConcurrentBag<CloudflareLog> cloudflareLogsBag = new ConcurrentBag<CloudflareLog>(); if (data != null) { foreach (var buff in data.buffList) { ETWPrase eTWPrase = new ETWPrase(buff); if (!parseEtwDataLog) { logger.Debug(JsonConvert.SerializeObject(eTWPrase)); parseEtwDataLog = true; //只打印一条明细ETW 日志 } if (!IfInSuffixList(eTWPrase.Cs_uri_stem)) { cloudflareLogs.Add(new CloudflareLog { ClientRequestHost = eTWPrase.Cs_host, ClientIP = !string.IsNullOrEmpty(eTWPrase.CFConnectingIP) ? eTWPrase.CFConnectingIP : eTWPrase.C_ip, ClientRequestURI = string.IsNullOrEmpty(eTWPrase.cs_uri_query) || "-".Equals(eTWPrase.cs_uri_query) ? eTWPrase.Cs_uri_stem : $"{eTWPrase.Cs_uri_stem}?{eTWPrase.cs_uri_query}", ClientRequestMethod = eTWPrase.Cs_method, }); } } //var list = data.buffList.ToList(); //Parallel.For(0, list.Count(), index => //{ // var buff = list[index]; // ETWPrase eTWPrase = new ETWPrase(buff); // cloudflareLogsBag.Add(new CloudflareLog // { // ClientRequestHost = eTWPrase.Cs_host, // ClientIP = !string.IsNullOrEmpty(eTWPrase.CFConnectingIP) ? eTWPrase.CFConnectingIP : eTWPrase.C_ip, // ClientRequestURI = string.Format("{0}?{1}", eTWPrase.Cs_uri_stem, eTWPrase.cs_uri_query), // ClientRequestMethod = eTWPrase.Cs_method, // }); //}); } //cloudflareLogs = cloudflareLogsBag.ToList(); if (data != null) { data.parsedData = cloudflareLogs; } return(cloudflareLogs); }
private void DoWorkOne() { EtwData data = null; try { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //data = datas.Where(a => a.enumEtwStatus == EnumEtwStatus.None) // .OrderByDescending(a => a.time).FirstOrDefault(); datas.TryDequeue(out data); if (data != null) { data.enumEtwStatus = EnumEtwStatus.Processing; Analyze(data); data.enumEtwStatus = EnumEtwStatus.Processed; stopwatch.Stop(); //logger.Info(JsonConvert.SerializeObject(new //{ // index = data.time, // time = stopwatch.Elapsed.TotalMilliseconds //})); } } catch (Exception e) { logger.Error(e.StackTrace); //Code review by michael, 为什么只打印堆栈不打印Message if (data != null) { data.retryCount += 1; if (data.retryCount > 5) { data.enumEtwStatus = EnumEtwStatus.Failed; logger.Error(JsonConvert.SerializeObject(data)); } else { data.enumEtwStatus = EnumEtwStatus.None; datas.Enqueue(data); } } } }
private void Analyze(EtwData data) { //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); //logger.Info($"Analyze in {DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss fff")}"); if (data != null) { //数据解析 var cloudflareLogs = ParseEtwData(data); //stopwatch.Stop(); //stopwatch.Restart(); if (null != cloudflareLogs && cloudflareLogs.Count > 0) { //logger.Info($"Analyze start {DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss fff")}"); //分析 var analyzeResult = AnalyzeRatelimit(cloudflareLogs); if (null != analyzeResult && null != analyzeResult.result && analyzeResult.result.Count > 0) { //发送结果 SendResult(analyzeResult); } } //stopwatch.Stop(); //stopwatch.Restart(); //logger.Info(JsonConvert.SerializeObject(new //{ // timeType = "SendResult", // time = stopwatch.Elapsed.TotalMilliseconds //})); handledDatas.Add(data); } }