AnalyseFileController.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.SDK.DI;
  12. using TEAMModelOS.SDK.Extension;
  13. using TEAMModelOS.SDK.Models.Cosmos.BI;
  14. namespace TEAMModelBI.Controllers.BIHome
  15. {
  16. [Route("analyse")]
  17. [ApiController]
  18. public class AnalyseFileController : ControllerBase
  19. {
  20. private readonly IWebHostEnvironment _environment; //读取文件流
  21. private readonly AzureStorageFactory _azureStorage;
  22. public AnalyseFileController(IWebHostEnvironment environment, AzureStorageFactory azureStorage)
  23. {
  24. _environment = environment;
  25. _azureStorage = azureStorage;
  26. }
  27. [HttpPost("get-visitjson")]
  28. public async Task<IActionResult> GetVisitJson(JsonElement jsonElement)
  29. {
  30. jsonElement.TryGetProperty("path", out JsonElement _path);
  31. jsonElement.TryGetProperty("time", out JsonElement _time);
  32. var path = $"{_environment.ContentRootPath}/JsonFile/TempFile/PT1H.json";
  33. StreamReader streamReader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
  34. List<object> objs = new();
  35. StringBuilder visits = new StringBuilder("[");
  36. string text;
  37. while ((text = streamReader.ReadLine()) != null)
  38. {
  39. if (streamReader.EndOfStream)
  40. visits.Append($"{text.ToString()}");
  41. else
  42. visits.Append($"{text.ToString()},");
  43. }
  44. visits.Append("]");
  45. streamReader.Close();
  46. string input = visits.ToString();
  47. List<AGInfo> aGInfos = input.ToObject<List<AGInfo>>();
  48. DateTimeOffset dtime = DateTimeOffset.UtcNow;
  49. string cHour = dtime.ToString("yyyyMMddHH");
  50. string cDay = dtime.ToString("yyyyMMdd");
  51. if (aGInfos.Count > 0)
  52. {
  53. cHour = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMddHH")).First();
  54. cDay = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMdd")).First();
  55. }
  56. Dictionary<string, object> kvList = new();
  57. //var ipGroup = aGInfos.GroupBy(g => g.properties.clientIp).ToDictionary(k => k.Key, k => k.Count()).ToList();
  58. List<RecGWInfo> recInfo = aGInfos.Select(s => new RecGWInfo { hour = cHour, ip = s.properties.clientIp, api = s.properties.requestUri.Split("?").ToList().Count() > 1 ? s.properties.requestUri.Split("?").ToList()[0] : s.properties.requestUri, hostName = s.properties.hostname }).ToList();
  59. List<RecApiCnt> apiCnt = recInfo.GroupBy(a => a.api).Select(g => new RecApiCnt { api = g.Key, count = g.Count(), hour = g.Select(h => h.hour).Distinct().ToList(), hostName = g.Select(h => h.hostName).Distinct().ToList(), ip = g.Select(i => i.ip).Distinct().ToList() }).ToList();
  60. kvList.Add("apiCnt", apiCnt);
  61. List<RecIpCnt> ipCnt = recInfo.GroupBy(a => a.ip).Select(g => new RecIpCnt { ip = g.Key, count = g.Count(), hour = g.Select(h => h.hour).Distinct().ToList(), hostName = g.Select(h => h.hostName).Distinct().ToList(), api = g.Select(i => i.api).Distinct().ToList() }).ToList();
  62. kvList.Add("ipCnt", ipCnt);
  63. var url = await _azureStorage.UploadFileByContainer("0-public", kvList.ToList().ToJsonString(), $"visitCnt/{cDay}", $"{cHour}.json");
  64. return Ok(new { state = 200, apiCon = apiCnt.Count(), apiSum = apiCnt.Select(ap => ap.count).Sum(), ipCount = ipCnt.Count, ipSum = ipCnt.Select(ip => ip.count).Sum(), ipCnt, apiCnt }); ;
  65. //return Ok(new { state = 200, cnt = recInfo.Count, apiCon = apiCnt.Count(), apiSum = apiCnt.Select(ap=> ap.count).Sum(), ipCount = ipCnt.Count, ipSum = ipCnt.Select(ip=>ip.count).Sum(), ipCnt,apiCnt, recInfo });;
  66. }
  67. public record RecCntBas
  68. {
  69. public int count { get; set; }
  70. public List<string> hour { get; set; }
  71. public List<string> hostName { get; set; }
  72. }
  73. public record RecIpCnt : RecCntBas
  74. {
  75. public string ip { get; set; }
  76. public List<string> api { get; set; }
  77. }
  78. public record RecApiCnt : RecCntBas
  79. {
  80. public string api { get; set; }
  81. public List<string> ip { get; set; }
  82. }
  83. public record RecGWInfo
  84. {
  85. public string hour { get; set; }
  86. public string ip { get; set; }
  87. public string api { get; set; }
  88. public string hostName { get; set; }
  89. }
  90. public record StatisNameCnt
  91. {
  92. public string name { get; set; }
  93. public int cnt { get; set; }
  94. }
  95. public record AGInfo
  96. {
  97. //public string resourceId { get; set; }
  98. public string operationName { get; set; }
  99. public string time { get; set; }
  100. public string category { get; set; }
  101. public Properties properties { get; set; }
  102. }
  103. public record Properties
  104. {
  105. //public string instanceId { get; set; }
  106. public string clientIp { get; set; }
  107. public string clientPort { get; set; }
  108. public string requestUri { get; set; }
  109. public string ruleSetType { get; set; }
  110. public string ruleSetVersion { get; set; }
  111. public string ruleId { get; set;}
  112. public string ruleGroup { get; set; }
  113. //public string message { get; set; }
  114. public string action { get; set; }
  115. public string site { get; set; }
  116. //public Datails datails { get; set; }
  117. public string hostname { get; set; }
  118. public string transactionId { get; set; }
  119. }
  120. public record Datails
  121. {
  122. public string message { get; set; }
  123. public string data { get; set; }
  124. public string file { get; set; }
  125. public string line { get; set; }
  126. }
  127. }
  128. }