using Elasticsearch.Net;
using Nest;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace XYY.PerformanceCount.Standard
{
///
/// 日志计数服务实现
///
public interface IPerformanceDB
{
Task AddLog(MethodPerformanceModel menthodPerformance);
Task> QueryLog(Query query);
}
public class ESPerformanceDB : IPerformanceDB
{
string indexName = "performance_count_1";
public ESPerformanceDB(string dbConnection)
{
string esNodeUrl = dbConnection;
Uri node = new Uri(esNodeUrl);
ConnectionSettings settings = new ConnectionSettings(node).DefaultMappingFor(x =>
x.IdProperty(i => i.Id).IndexName(indexName).TypeName("doc")).DefaultIndex(indexName);
//3s超时
settings.RequestTimeout(new TimeSpan(0, 0, 3));
IIndexState indexState = new IndexState()
{
Settings = new IndexSettings()
{
NumberOfReplicas = 0,//副本数
NumberOfShards = 1//分片数
}
};
_client = new ElasticClient(settings);
if (!_client.IndexExists(indexName).Exists)
{
_client.CreateIndex(indexName, p => p.InitializeUsing(indexState));
}
}
private ElasticClient _client;
public async Task AddLog(MethodPerformanceModel menthodPerformance)
{
await _client.IndexDocumentAsync(menthodPerformance);
}
public async Task> QueryLog(Query query)
{
if (!string.IsNullOrEmpty(query.SearchParameter))
{
var sq1 = new Func, QueryContainer>(q => q.Bool(b =>
b.Filter(f =>
f.DateRange(r =>
r.Field("startTime")
.GreaterThanOrEquals(query.StartTime)
.LessThan(query.EndTime)
)
,
f =>
f.Bool(
b2 => b2.Must(
m => m.MatchPhrase(
mp => mp.Field("mehtodName").Query(
query.MethodName)))),
f =>
f.Range(r =>
r.Field("executionTime")
.GreaterThanOrEquals(query.ExecutionTime)
),
f =>
f.Bool(
b2 => b2.Must(
m => m.MatchPhrase(
mp => mp.Field("requestParameters").Query(
query.SearchParameter))))
)));
var result = await _client.SearchAsync(s =>
s.Query(sq1).Size(query.Size).From(query.Size * (query.Index - 1)));
return result.Documents;
}
else
{
var sq1 = new Func, QueryContainer>(q => q.Bool(b =>
b.Filter(f =>
f.DateRange(r =>
r.Field("startTime")
.GreaterThanOrEquals(query.StartTime)
.LessThan(query.EndTime)
)
,
f =>
f.Range(r =>
r.Field("executionTime")
.GreaterThanOrEquals(query.ExecutionTime)
),
f =>
f.Bool(
b2 => b2.Must(
m => m.MatchPhrase(
mp => mp.Query(
query.MethodName))))
)));
var result = await _client.SearchAsync(s =>
s.Query(sq1).Size(query.Size).From(query.Size * (query.Index - 1)));
return result.Documents;
}
}
}
}