using System; using Top.Api.Util; using System.Threading; using System.Collections.Generic; using Top.Api.Security; using System.Text; namespace Top.Api.Report { public class ApiReporter { private static readonly ITopLogger Log = Top.Api.Log.Instance; private static readonly object InitSecretLock = new object(); private static readonly int SleepTime = 1000 * 60 * 1; private static readonly int FlushInterval = 1000 * 60 * 5;// 5分钟 private static readonly int MinFlushInterval = 1000 * 60 * 1;// 1分钟 private static readonly string AppSecretType = "2"; private static readonly string AppUserSecretType = "3"; private static readonly IDictionary AppInitStatus = new Dictionary(); private DefaultTopClient topClient; private bool EnableApiReporter = false; public void InitSecret(DefaultTopClient defaultTaobaoClient) { string appkey = defaultTaobaoClient.appKey; this.topClient = defaultTaobaoClient; if(!EnableApiReporter) { return; } lock (InitSecretLock) { if (AppInitStatus.ContainsKey(appkey)) { return; } InitSecretThread(); AppInitStatus.Add(appkey, true); } } public void SetEnableApiReporter(bool enable) { this.EnableApiReporter = enable; } private void InitSecretThread() { Thread uploadThread = new Thread(o => { DoUploadBiz(); }); uploadThread.IsBackground = true; uploadThread.Name = "flushSecretApiReporter-thread"; uploadThread.Start(); } private void DoUploadBiz() { long uploadTime = TopUtils.GetCurrentTimeMillis() + FlushInterval; while (true) { try { Thread.Sleep(SleepTime); IDictionary appUserCounterMap = SecurityCounter.GetUserCounter(topClient.appKey); if (TopUtils.GetCurrentTimeMillis() >= uploadTime || (appUserCounterMap.Count * 4 > 65536)) { StringBuilder counterBuilder = new StringBuilder(); IDictionary cloneAppUserCounter = SecurityCounter.CloneUserCounter(topClient.appKey); SecurityCounter.CleanUserCounter(topClient.appKey); int count = 0; foreach (KeyValuePair currentPair in cloneAppUserCounter) { Counter counter = currentPair.Value; if (counterBuilder.Length > 0) { counterBuilder.Append(";"); } counterBuilder.Append(currentPair.Key); GenerateCounter(counterBuilder, counter); if ((++count) % 100 == 0) { DoUpload(counterBuilder.ToString(), AppUserSecretType); counterBuilder = new StringBuilder(); } } if (counterBuilder.Length > 0) { DoUpload(counterBuilder.ToString(), AppUserSecretType); counterBuilder = new StringBuilder(); } Counter appCounter = SecurityCounter.GetAppCounter(topClient.appKey); counterBuilder.Append(SecurityCore.GetAppUserSecretCache().Count); GenerateCounter(counterBuilder, appCounter); appCounter.Reset(); long uploadInterval = DoUpload(counterBuilder.ToString(), AppSecretType); uploadTime = TopUtils.GetCurrentTimeMillis() + uploadInterval; } } catch (Exception e) { Log.Error(string.Format("flushSecretApiReporter error: {0}", e.Message)); } } } private IDictionary CloneAppUserCounter(IDictionary sourceDictionary) { IDictionary targetDictionary = new Dictionary(); foreach (KeyValuePair currentPair in sourceDictionary) { targetDictionary.Add(currentPair.Key, currentPair.Value); } return targetDictionary; } private int DoUpload(string contentJson, string type) { int uploadInterval = FlushInterval; TopSdkFeedbackUploadRequest request = new TopSdkFeedbackUploadRequest(); request.Type = type; request.Content = contentJson; TopSdkFeedbackUploadResponse response = topClient.Execute(request, null); if (!response.IsError) { uploadInterval = response.UploadInterval; if (uploadInterval < MinFlushInterval) { uploadInterval = FlushInterval; } } return uploadInterval; } private void GenerateCounter(StringBuilder counterBuilder, Counter counter) { // encrypt if (counterBuilder.Length > 0) { counterBuilder.Append(","); } if (SecurityCounter.GetAppCounter(topClient.appKey).GetEncryptPhoneNum() != 0) { counterBuilder.Append(counter.GetEncryptPhoneNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetEncryptNickNum() != 0) { counterBuilder.Append(counter.GetEncryptNickNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetEncryptReceiverNameNum() != 0) { counterBuilder.Append(counter.GetEncryptReceiverNameNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetEncryptSimpleNum() != 0) { counterBuilder.Append(counter.GetEncryptSimpleNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetEncryptSearchNum() != 0) { counterBuilder.Append(counter.GetEncryptSearchNum()); } else { counterBuilder.Append("0"); } // decrypt counterBuilder.Append(","); if (counter.GetDecryptPhoneNum() != 0) { counterBuilder.Append(counter.GetDecryptPhoneNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetDecryptNickNum() != 0) { counterBuilder.Append(counter.GetDecryptNickNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetDecryptReceiverNameNum() != 0) { counterBuilder.Append(counter.GetDecryptReceiverNameNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetDecryptSimpleNum() != 0) { counterBuilder.Append(counter.GetDecryptSimpleNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetDecryptSearchNum() != 0) { counterBuilder.Append(counter.GetDecryptSearchNum()); } else { counterBuilder.Append("0"); } // search counterBuilder.Append(","); if (counter.GetSearchPhoneNum() != 0) { counterBuilder.Append(counter.GetSearchPhoneNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetSearchNickNum() != 0) { counterBuilder.Append(counter.GetSearchNickNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetSearchReceiverNameNum() != 0) { counterBuilder.Append(counter.GetSearchReceiverNameNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetSearchSimpleNum() != 0) { counterBuilder.Append(counter.GetSearchSimpleNum()); } else { counterBuilder.Append("0"); } counterBuilder.Append(","); if (counter.GetSearchSearchNum() != 0) { counterBuilder.Append(counter.GetSearchSearchNum()); } else { counterBuilder.Append("0"); } } } }