Browse Source

impl monitoring api interface.

master
yangxiaodong 7 years ago
parent
commit
da77108f3c
1 changed files with 90 additions and 92 deletions
  1. +90
    -92
      src/DotNetCore.CAP.SqlServer/SqlServerMonitoringApi.cs

+ 90
- 92
src/DotNetCore.CAP.SqlServer/SqlServerMonitoringApi.cs View File

@@ -2,10 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Text;
using Dapper; using Dapper;
using DotNetCore.CAP.Dashboard; using DotNetCore.CAP.Dashboard;
using DotNetCore.CAP.Dashboard.Monitoring; using DotNetCore.CAP.Dashboard.Monitoring;
using DotNetCore.CAP.Infrastructure;


namespace DotNetCore.CAP.SqlServer namespace DotNetCore.CAP.SqlServer
{ {
@@ -23,152 +23,150 @@ namespace DotNetCore.CAP.SqlServer
_storage = storage as SqlServerStorage; _storage = storage as SqlServerStorage;
} }


public JobList<DeletedJobDto> DeletedJobs(int from, int count)
public IDictionary<DateTime, int> FailedByDatesCount()
{ {
return new JobList<DeletedJobDto>(new Dictionary<string, DeletedJobDto>());
}

public long DeletedListCount()
{
return 11;
}

public long EnqueuedCount(string queue)
{
return 11;
}

public JobList<EnqueuedJobDto> EnqueuedJobs(string queue, int from, int perPage)
{
return new JobList<EnqueuedJobDto>(new Dictionary<string, EnqueuedJobDto>());
}

public IDictionary<DateTime, long> FailedByDatesCount()
{
return new Dictionary<DateTime, long>();
}

public long FailedCount()
{
return 11;
}

public JobList<FailedJobDto> FailedJobs(int from, int count)
{
return new JobList<FailedJobDto>(new Dictionary<string, FailedJobDto>());
}

public long FetchedCount(string queue)
{
return 11;
}

public JobList<FetchedJobDto> FetchedJobs(string queue, int from, int perPage)
{
return new JobList<FetchedJobDto>(new Dictionary<string, FetchedJobDto>());
return new Dictionary<DateTime, int>();
} }


public StatisticsDto GetStatistics() public StatisticsDto GetStatistics()
{ {
string sql = String.Format(@" string sql = String.Format(@"
set transaction isolation level read committed; set transaction isolation level read committed;
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Enqueued';
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Succeeded';
select count(Id) from [{0}].Received with (nolock) where StatusName = N'Succeeded';
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Failed'; select count(Id) from [{0}].Published with (nolock) where StatusName = N'Failed';
select count(Id) from [{0}].Received with (nolock) where StatusName = N'Failed';
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Processing'; select count(Id) from [{0}].Published with (nolock) where StatusName = N'Processing';
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Scheduled';
select 11;
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Successed';
select count(Id) from [{0}].Published with (nolock) where StatusName = N'Deleted';
select 14;
", _options.Schema);
select count(Id) from [{0}].Received with (nolock) where StatusName = N'Processing';",
_options.Schema);


var statistics = UseConnection(connection => var statistics = UseConnection(connection =>
{ {
var stats = new StatisticsDto(); var stats = new StatisticsDto();
using (var multi = connection.QueryMultiple(sql)) using (var multi = connection.QueryMultiple(sql))
{ {
stats.Enqueued = multi.ReadSingle<int>();
stats.Failed = multi.ReadSingle<int>();
stats.Processing = multi.ReadSingle<int>();
stats.Scheduled = multi.ReadSingle<int>();
stats.PublishedSucceeded = multi.ReadSingle<int>();
stats.ReceivedSucceeded = multi.ReadSingle<int>();


stats.Servers = multi.ReadSingle<int>();
stats.PublishedFailed = multi.ReadSingle<int>();
stats.ReceivedFailed = multi.ReadSingle<int>();


stats.Succeeded = multi.ReadSingleOrDefault<long?>() ?? 0;
stats.Deleted = multi.ReadSingleOrDefault<long?>() ?? 0;

stats.Recurring = multi.ReadSingle<int>();
stats.PublishedProcessing = multi.ReadSingle<int>();
stats.ReceivedProcessing = multi.ReadSingle<int>();
} }
return stats; return stats;
}); });

//statistics.Queues = _storage.QueueProviders
// .SelectMany(x => x.GetJobQueueMonitoringApi().GetQueues())
// .Count();
statistics.Queues = 3;
statistics.Servers = 1;
return statistics; return statistics;
} }


public IDictionary<DateTime, long> HourlyFailedJobs()
public IDictionary<DateTime, int> HourlyFailedJobs()
{ {
return UseConnection(connection => return UseConnection(connection =>
GetHourlyTimelineStats(connection, "failed")); GetHourlyTimelineStats(connection, "failed"));
} }


public IDictionary<DateTime, long> HourlySucceededJobs()
public IDictionary<DateTime, int> HourlySucceededJobs()
{ {
return UseConnection(connection => return UseConnection(connection =>
GetHourlyTimelineStats(connection, "succeeded")); GetHourlyTimelineStats(connection, "succeeded"));
} }


public JobDetailsDto JobDetails(string jobId)
public IList<ServerDto> Servers()
{ {
return new JobDetailsDto();
return new List<ServerDto>();
} }


public long ProcessingCount()
public IDictionary<DateTime, int> SucceededByDatesCount()
{ {
return 11;
return new Dictionary<DateTime, int>();
} }


public JobList<ProcessingJobDto> ProcessingJobs(int from, int count)
public IList<MessageDto> Messages(MessageQueryDto queryDto)
{ {
return new JobList<ProcessingJobDto>(new Dictionary<string, ProcessingJobDto>());
var tableName = queryDto.MessageType == Models.MessageType.Publish ? "Published" : "Received";
var where = string.Empty;
if (!string.IsNullOrEmpty(queryDto.StatusName))
{
where += " and statusname=@StatusName";
}
if (!string.IsNullOrEmpty(queryDto.Name))
{
where += " and name=@Name";
}
if (!string.IsNullOrEmpty(queryDto.Content))
{
where += " and content like '%@Content%'";
}

var sqlQuery = $"select * from [{_options.Schema}].{tableName} where 1=1 {where} order by Added desc offset @Offset rows fetch next @Limit rows only";

return UseConnection(conn =>
{
return conn.Query<MessageDto>(sqlQuery, new
{
StatusName = queryDto.StatusName,
Name = queryDto.Name,
Content = queryDto.Content,
Offset = queryDto.CurrentPage * queryDto.PageSize,
Limit = queryDto.PageSize,
}).ToList();
});
} }


public IList<QueueWithTopEnqueuedJobsDto> Queues()
public int PublishedFailedCount()
{ {
return new List<QueueWithTopEnqueuedJobsDto>();
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Published", StatusName.Failed);
});
} }


public long ScheduledCount()
public int PublishedProcessingCount()
{ {
return 0;
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Published", StatusName.Processing);
});
} }


public JobList<ScheduledJobDto> ScheduledJobs(int from, int count)
public int PublishedSucceededCount()
{ {
return new JobList<ScheduledJobDto>(new Dictionary<string, ScheduledJobDto>());
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Published", StatusName.Succeeded);
});
} }


public IList<ServerDto> Servers()
public int ReceivedFailedCount()
{ {
return new List<ServerDto>();
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Received", StatusName.Failed);
});
} }


public IDictionary<DateTime, long> SucceededByDatesCount()
public int ReceivedProcessingCount()
{ {
return new Dictionary<DateTime, long>();
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Received", StatusName.Processing);
});
} }


public JobList<SucceededJobDto> SucceededJobs(int from, int count)
public int ReceivedSucceededCount()
{ {
return new JobList<SucceededJobDto>(new Dictionary<string, SucceededJobDto>());
return UseConnection(conn =>
{
return GetNumberOfMessage(conn, "Received", StatusName.Succeeded);
});
} }


public long SucceededListCount()
private int GetNumberOfMessage(IDbConnection connection, string tableName, string statusName)
{ {
return 11;
var sqlQuery = $"select count(Id) from [{_options.Schema}].{tableName} with (nolock) where StatusName = @state";
var count = connection.ExecuteScalar<int>(sqlQuery, new { state = statusName });
return count;
} }


private T UseConnection<T>(Func<IDbConnection, T> action) private T UseConnection<T>(Func<IDbConnection, T> action)
@@ -176,7 +174,7 @@ select 14;
return _storage.UseConnection(action); return _storage.UseConnection(action);
} }


private Dictionary<DateTime, long> GetHourlyTimelineStats(IDbConnection connection, string type)
private Dictionary<DateTime, int> GetHourlyTimelineStats(IDbConnection connection, string type)
{ {
var endDate = DateTime.UtcNow; var endDate = DateTime.UtcNow;
var dates = new List<DateTime>(); var dates = new List<DateTime>();
@@ -191,7 +189,7 @@ select 14;
return GetTimelineStats(connection, keyMaps); return GetTimelineStats(connection, keyMaps);
} }


private Dictionary<DateTime, long> GetTimelineStats(IDbConnection connection, string type)
private Dictionary<DateTime, int> GetTimelineStats(IDbConnection connection, string type)
{ {
var endDate = DateTime.UtcNow.Date; var endDate = DateTime.UtcNow.Date;
var dates = new List<DateTime>(); var dates = new List<DateTime>();
@@ -206,7 +204,7 @@ select 14;
return GetTimelineStats(connection, keyMaps); return GetTimelineStats(connection, keyMaps);
} }


private Dictionary<DateTime, long> GetTimelineStats(
private Dictionary<DateTime, int> GetTimelineStats(
IDbConnection connection, IDbConnection connection,
IDictionary<string, DateTime> keyMaps) IDictionary<string, DateTime> keyMaps)
{ {
@@ -217,14 +215,14 @@ where [Key] in @keys";
var valuesMap = connection.Query( var valuesMap = connection.Query(
sqlQuery, sqlQuery,
new { keys = keyMaps.Keys }) new { keys = keyMaps.Keys })
.ToDictionary(x => (string)x.Key, x => (long)x.Count);
.ToDictionary(x => (string)x.Key, x => (int)x.Count);


foreach (var key in keyMaps.Keys) foreach (var key in keyMaps.Keys)
{ {
if (!valuesMap.ContainsKey(key)) valuesMap.Add(key, 0); if (!valuesMap.ContainsKey(key)) valuesMap.Add(key, 0);
} }


var result = new Dictionary<DateTime, long>();
var result = new Dictionary<DateTime, int>();
for (var i = 0; i < keyMaps.Count; i++) for (var i = 0; i < keyMaps.Count; i++)
{ {
var value = valuesMap[keyMaps.ElementAt(i).Key]; var value = valuesMap[keyMaps.ElementAt(i).Key];
@@ -234,4 +232,4 @@ where [Key] in @keys";
return result; return result;
} }
} }
}
}

Loading…
Cancel
Save