using Azure.Storage.Blobs.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using static TEAMModelOS.SDK.Models.Service.SystemService; using System.Collections.Concurrent; using System.Text.Json; using System.Text; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Models.Service; using TEAMModelOS.SDK; using TEAMModelOS.SDK.Extension; using Azure.Storage.Blobs.Specialized; namespace HTEX.Complex.Controllers { [ApiController] [Route("api")] public class IndexController : ControllerBase { private readonly DingDing _dingDing; private readonly IHttpClientFactory _httpClient; private readonly IConfiguration _configuration; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; private readonly IPSearcher _ipSearcher; private readonly Region2LongitudeLatitudeTranslator _longitudeLatitudeTranslator; public IndexController(AzureRedisFactory azureRedis, Region2LongitudeLatitudeTranslator longitudeLatitudeTranslator, IHttpClientFactory httpClient, IConfiguration configuration, AzureStorageFactory azureStorage, IPSearcher searcher, DingDing dingDing) { _httpClient = httpClient; _configuration = configuration; _azureStorage = azureStorage; _ipSearcher = searcher; _dingDing = dingDing; _azureRedis=azureRedis; _longitudeLatitudeTranslator = longitudeLatitudeTranslator; } /// /// 上传到blob /// /// /// [HttpPost("http-log")] [RequestSizeLimit(102_400_000_00)] //最大10000m左右 public async Task HttpLog(JsonElement json) { try { string data = json.ToJsonString(); var gmt8Time = DateTimeOffset.Now.GetGMTTime(8); var appendBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/{gmt8Time:HH}.log"); if (!await appendBlob.ExistsAsync()) { await appendBlob.CreateAsync(); } using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{data},\n"))) { await appendBlob.AppendBlockAsync(stream); } return Ok(new { code = 1 }); } catch (Exception ex) { return Ok(new { code = 1 }); } } [HttpPost("report-api-settle")] [AllowAnonymous] [RequestSizeLimit(102_400_000_00)] //最大10000m左右 public async Task ReportApiSettle(JsonElement json) { List times = json.GetProperty("times").ToObject>(); return Ok(new { }); } [HttpPost("report-api-reload")] [AllowAnonymous] [RequestSizeLimit(102_400_000_00)] //最大10000m左右 public async Task ReportApiTest(JsonElement json) { try { List times = json.GetProperty("times").ToObject>(); foreach (var timeDate in times) { if (DateTimeOffset.TryParse(timeDate, out DateTimeOffset date)) { var gmt8Time = date.GetGMTTime(8); var nowGmt8Time = DateTimeOffset.Now.GetGMTTime(8); List logs = await _azureStorage.GetBlobContainerClient("0-service-log").List($"http-log/{date:yyyy}/{date:MM}/{date:dd}"); List httpLogs = new List(); foreach (var log in logs) { string nowPath = $"{nowGmt8Time:yyyy/MM/dd/HH}.log"; if (!log.Contains("index.log") && !log.Contains(".json") &&!log.Contains(nowPath)) { BlobDownloadResult result = await _azureStorage.GetBlobContainerClient("0-service-log").GetBlobBaseClient(log).DownloadContentAsync(); var content = result.Content.ToString(); content= content.Substring(0, content.Length-2); if (content.EndsWith("}")) { content=$"[{content}]"; } else { content=$"[{content}}}]"; } httpLogs.AddRange(content.ToObject>()); } } (ConcurrentBag visits, ConcurrentBag<(string uuid, HttpLog httpLog, List tmdid, List school)> uuidInfo) = await SystemService.ConvertHttpLog(httpLogs, _azureRedis, _ipSearcher, _longitudeLatitudeTranslator, gmt8Time, true); if (visits!=null && visits.Count>0) { var appendDayBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/index.log"); if (!await appendDayBlob.ExistsAsync()) { await appendDayBlob.CreateAsync(); } else { await appendDayBlob.DeleteAsync(); await appendDayBlob.CreateAsync(); } int maxSize = 4*1024 * 1024; // 1M List parts = new List(); StringBuilder sb = new StringBuilder(); foreach (var item in visits) { string jsonString = $"{item.ToJsonString()},\n"; int currentSize = Encoding.UTF8.GetByteCount(sb.ToString()); if (currentSize + Encoding.UTF8.GetByteCount(jsonString) > maxSize) { parts.Add(sb.ToString()); sb.Clear(); } sb.Append(jsonString); } if (sb.Length > 0) { parts.Add(sb.ToString()); } foreach (string part in parts) { using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(part))) { await appendDayBlob.AppendBlockAsync(stream); } } //using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{sb}"))) //{ // await appendDayBlob.AppendBlockAsync(stream); //} } } } //全网:用户访问数,学校访问数,学生访问数,不同业务访问量, return Ok(new { }); } catch (Exception ex) { await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組); } return Ok(); } /// /// 使用时长,一天内累计 /// /// /// [HttpPost("report-api")] [AllowAnonymous] [RequestSizeLimit(102_400_000_00)] //最大10000m左右 public async Task ReportApi(JsonElement json) { var force = json.GetProperty("force").GetString(); List times = json.GetProperty("times").ToObject>(); await SystemService.VisitSettle(times, _azureStorage, _azureRedis, _longitudeLatitudeTranslator, _ipSearcher, $"{force}"); return Ok(new { code = 200 }); } } }