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<string, object> AppInitStatus = new Dictionary<string, object>();
|
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<string, Counter> appUserCounterMap = SecurityCounter.GetUserCounter(topClient.appKey);
|
if (TopUtils.GetCurrentTimeMillis() >= uploadTime || (appUserCounterMap.Count * 4 > 65536))
|
{
|
StringBuilder counterBuilder = new StringBuilder();
|
IDictionary<string, Counter> cloneAppUserCounter = SecurityCounter.CloneUserCounter(topClient.appKey);
|
SecurityCounter.CleanUserCounter(topClient.appKey);
|
|
int count = 0;
|
foreach (KeyValuePair<string, Counter> 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<string, Counter> CloneAppUserCounter(IDictionary<string, Counter> sourceDictionary)
|
{
|
IDictionary<string, Counter> targetDictionary = new Dictionary<string, Counter>();
|
foreach (KeyValuePair<string, Counter> 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");
|
}
|
}
|
}
|
}
|