AnalyseFileController.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using Azure.Storage.Blobs;
  2. using Azure.Storage.Blobs.Models;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Mvc;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.Json;
  12. using System.Threading.Tasks;
  13. using TEAMModelOS.SDK.Context.BI;
  14. using TEAMModelOS.SDK.DI;
  15. using TEAMModelOS.SDK.Extension;
  16. using TEAMModelOS.SDK.Models.Cosmos.BI;
  17. namespace TEAMModelBI.Controllers.BIHome
  18. {
  19. [Route("analyse")]
  20. [ApiController]
  21. public class AnalyseFileController : ControllerBase
  22. {
  23. private readonly IWebHostEnvironment _environment; //读取文件流
  24. private readonly AzureStorageFactory _azureStorage;
  25. public AnalyseFileController(IWebHostEnvironment environment, AzureStorageFactory azureStorage)
  26. {
  27. _environment = environment;
  28. _azureStorage = azureStorage;
  29. }
  30. /// <summary>
  31. /// 本地Json
  32. /// </summary>
  33. /// <param name="jsonElement"></param>
  34. /// <returns></returns>
  35. [HttpPost("get-visitjson")]
  36. public async Task<IActionResult> GetVisitJson(JsonElement jsonElement)
  37. {
  38. jsonElement.TryGetProperty("path", out JsonElement _path);
  39. jsonElement.TryGetProperty("time", out JsonElement _time);
  40. var path = $"{_environment.ContentRootPath}/JsonFile/TempFile/PT1H.json";
  41. StreamReader streamReader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
  42. List<object> objs = new();
  43. StringBuilder visits = new StringBuilder("[");
  44. string text;
  45. while ((text = streamReader.ReadLine()) != null)
  46. {
  47. if (streamReader.EndOfStream)
  48. visits.Append($"{text.ToString()}");
  49. else
  50. visits.Append($"{text.ToString()},");
  51. }
  52. visits.Append("]");
  53. streamReader.Close();
  54. string input = visits.ToString();
  55. List<AGInfo> aGInfos = input.ToObject<List<AGInfo>>();
  56. DateTimeOffset dtime = DateTimeOffset.UtcNow;
  57. string cHour = dtime.ToString("yyyyMMddHH");
  58. string cDay = dtime.ToString("yyyyMMdd");
  59. if (aGInfos.Count > 0)
  60. {
  61. cHour = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMddHH")).First();
  62. cDay = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMdd")).First();
  63. }
  64. RecCnt saveCnts = new();
  65. //var ipGroup = aGInfos.GroupBy(g => g.properties.clientIp).ToDictionary(k => k.Key, k => k.Count()).ToList();
  66. List<RecAppGWInfo> recInfo = aGInfos.Select(s => new RecAppGWInfo { 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();
  67. List<RecApiCnt> apiCnt = recInfo.GroupBy(a => a.api).Select(g => new RecApiCnt { api = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), ip = g.Select(i => i.ip).Distinct().ToList() }).ToList();
  68. saveCnts.apiCnt= apiCnt;
  69. List<RecIpCnt> ipCnt = recInfo.GroupBy(a => a.ip).Select(g => new RecIpCnt { ip = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), api = g.Select(i => i.api).Distinct().ToList() }).ToList();
  70. saveCnts.ipCnt = ipCnt;
  71. ////保存存至Blob文件
  72. var url = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(saveCnts.ToJsonString(), $"visitCnt/{cDay}", $"{cHour}.json");
  73. var blob = _azureStorage.GetBlobContainerClient($"0-public");
  74. List<RecCnt> recCnts = new();
  75. await foreach (BlobItem blobItem in blob.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{cDay}"))
  76. {
  77. BlobClient blobClient = blob.GetBlobClient(blobItem.Name);
  78. if (await blobClient.ExistsAsync())
  79. {
  80. using (var meomoryStream = new MemoryStream())
  81. {
  82. var response = blob.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  83. //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
  84. var temps = meomoryStream.ToString();
  85. var temp1 = Encoding.UTF8.GetString(meomoryStream.ToArray());
  86. var temp = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToObject<RecCnt>();
  87. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  88. recCnts.Add(recCnt);
  89. }
  90. }
  91. }
  92. return Ok(new { state = 200, recCnts, apiCon = apiCnt.Count(), apiSum = apiCnt.Select(ap => ap.count).Sum(), ipCount = ipCnt.Count, ipSum = ipCnt.Select(ip => ip.count).Sum(), ipCnt, apiCnt }); ;
  93. }
  94. /// <summary>
  95. /// 日志访问秘钥
  96. /// </summary>
  97. /// <param name="jsonElement"></param>
  98. /// <returns></returns>
  99. [HttpPost("get-loginfos")]
  100. public async Task<IActionResult> GetOSLog(JsonElement jsonElement)
  101. {
  102. jsonElement.TryGetProperty("site", out JsonElement site);
  103. var blobClient = _azureStorage.GetBlobContainerClient($"insights-logs-applicationgatewayfirewalllog",name:BIConst.LogChina);
  104. if ($"{site}".Equals(BIConst.Global))
  105. {
  106. blobClient = _azureStorage.GetBlobContainerClient($"insights-logs-applicationgatewayfirewalllog", name: BIConst.LogGlobal);
  107. }
  108. //List<ReadContent> contents = new();
  109. List<RecCnt> recCnts = new();
  110. List<string> urls = new();
  111. //地址: y={year}/m={month}/d={day}/h={hour}/m=00/PT1H.json
  112. string logName = "resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/OSFIREWARE";
  113. await foreach (BlobItem blobItem in blobClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, logName))
  114. {
  115. StringBuilder visits = new("[");
  116. BlobClient tempBlobClient = blobClient.GetBlobClient(blobItem.Name);
  117. BlobDownloadInfo download = tempBlobClient.Download();
  118. var content = download.Content;
  119. string text;
  120. using (var streamReader = new StreamReader(content))
  121. {
  122. while ((text = streamReader.ReadLine()) != null)
  123. {
  124. if (streamReader.EndOfStream)
  125. visits.Append($"{text.ToString()}");
  126. else
  127. visits.Append($"{text.ToString()},");
  128. }
  129. visits.Append("]");
  130. streamReader.Close();
  131. }
  132. string input = visits.ToString();
  133. List<AGInfo> aGInfos = input.ToObject<List<AGInfo>>();
  134. DateTimeOffset dtime = DateTimeOffset.UtcNow;
  135. string cHour = dtime.ToString("yyyyMMddHH");
  136. string cDay = dtime.ToString("yyyyMMdd");
  137. if (aGInfos.Count > 0)
  138. {
  139. cHour = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMddHH")).First();
  140. cDay = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMdd")).First();
  141. }
  142. RecCnt saveCnts = new();
  143. List<RecAppGWInfo> recInfo = aGInfos.Select(s => new RecAppGWInfo { 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();
  144. List<RecApiCnt> apiCnt = recInfo.GroupBy(a => a.api).Select(g => new RecApiCnt { api = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), ip = g.Select(i => i.ip).Distinct().ToList() }).ToList();
  145. saveCnts.apiCnt = apiCnt;
  146. List<RecIpCnt> ipCnt = recInfo.GroupBy(a => a.ip).Select(g => new RecIpCnt { ip = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), api = g.Select(i => i.api).Distinct().ToList() }).ToList();
  147. saveCnts.ipCnt = ipCnt;
  148. recCnts.Add(saveCnts);
  149. ////保存存至Blob文件
  150. var url = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(saveCnts.ToJsonString(), $"visitCnt/{cDay}", $"{cHour}.json");
  151. urls.Add(url);
  152. }
  153. return Ok(new { state = 200, recCnts, urls });
  154. }
  155. }
  156. }