aktueller stand
This commit is contained in:
@@ -45,6 +45,8 @@ namespace C4IT.DataHistoryProvider
|
||||
public const string constCitrixSessionMachine = "monitorodata/Sessions?$select=SessionKey&$filter=SessionKey eq {0}&$expand=Machine($expand=CurrentLoadIndex,Catalog,DesktopGroup($select=Name)),Machine";
|
||||
public const string constCitrixSessionCurrentConnection = "monitorodata/Sessions?$select=SessionKey&$filter=SessionKey eq {0}&$expand=CurrentConnection,LogOnMetrics";
|
||||
public const string constCitrixSessionConnections = "monitorodata/Sessions?$select=SessionKey&$filter=SessionKey eq {0}&$expand=Connection";
|
||||
public const string constCitrixSessionLogInSummaries = "monitorodata/Sessions?$filter=UserId in ({0})$select=Id,StartDate&$expand=User($select=UserName),LogOnSummaries($select=LogOnDuration,AuthenticationDuration,BrokingDuration,ProfileLoadDuration,GpoProcessingDuration,InteractiveSessionDuration)";
|
||||
public const string constCitrixSessionLogInSummaries2 = "monitorodata/LogOnSummaries?$expand=Session($expand=User)&$filter=UserId eq {0}";
|
||||
public const string constCitrixUserConnections = "monitorodata/Sessions?$filter=UserId in ({0})&$expand=Connection";
|
||||
public const string constCitrixSessionUser = "monitorodata/Sessions?$select=SessionKey&$filter=SessionKey eq {0}&$expand=User";
|
||||
public const string constCitrixSessionLogoff = "cvad/manage/Sessions/{0}/$logoff";
|
||||
@@ -55,6 +57,7 @@ namespace C4IT.DataHistoryProvider
|
||||
public const string constTableNameSessionConnection = "citrix-session-connection";
|
||||
public const string constTableNameSessionCurrentConnection = "citrix-session-currentConnection";
|
||||
public const string constTableNameSessionMetrics = "citrix-session-metrics";
|
||||
public const string constTableNameSessionStateMetrics = "citrix-connectionState-metrics";
|
||||
public const string constTableNameSessionUser = "citrix-session-user";
|
||||
public const string constTableNameSessionDetailsIcaRttMS = "citrix-session-details-icaRttMS";
|
||||
public const string constTableNameSessionDetailsIcaLatency = "citrix-session-details-icaLatency";
|
||||
@@ -327,7 +330,7 @@ namespace C4IT.DataHistoryProvider
|
||||
return null;
|
||||
|
||||
var res = await citrixCommunication.RequestListAsync(strUrl, retryForbidden: false);
|
||||
if (res != null)
|
||||
if (res != null == res.Count > 0)
|
||||
{
|
||||
JObject sessionInfos = res[0].Result;
|
||||
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
|
||||
@@ -339,7 +342,13 @@ namespace C4IT.DataHistoryProvider
|
||||
TableType = eDataHistoryTableType.Static
|
||||
};
|
||||
|
||||
var dicVals = new List<Dictionary<string, object>>();
|
||||
foreach (var Entry in res) {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
var dicVals = new List<Dictionary<string, object>>();
|
||||
var vals = sessionInfos.Children();
|
||||
var metricsObj = sessionInfos["SessionMetrics"] as JArray;
|
||||
|
||||
@@ -408,8 +417,6 @@ namespace C4IT.DataHistoryProvider
|
||||
var aggregatedValue = GetAggregationValue(valuesOfColumn, configColumn.AggregationType, colInfo.ValueType);
|
||||
AddColumnData(retVal, colInfo.SourceName, ConvertToF4sdType(aggregatedValue, colInfo.ValueType));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
@@ -446,6 +453,179 @@ namespace C4IT.DataHistoryProvider
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<cF4SDHealthCardRawData.cHealthCardTable>> GetSessionStateMetricsAsync(cF4sdConnectorIds UserIds, string TenantId, cF4sdWebRequestInfo RequestInfo, int MaxAge, int LogDeep, CancellationToken Token)
|
||||
{
|
||||
|
||||
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
|
||||
if (cPerformanceLogger.IsActive && RequestInfo != null) { if (CM == null) CM = MethodBase.GetCurrentMethod(); cPerformanceLogger.LogPerformanceStart(LogDeep, CM, RequestInfo.id, RequestInfo.created); }
|
||||
var _startTime = DateTime.UtcNow;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
var strUrl = string.Format(constCitrixSessions, UserIds.citrixUserId.ToString());
|
||||
|
||||
if (!Collector.ClusterConfig.Tables.TryGetValue(constTableNameSessionStateMetrics, out var SessionTableDetails))
|
||||
return null;
|
||||
|
||||
var citrixCommunication = await GetCitrixCommunicationForTenantAsync(TenantId, true);
|
||||
if (citrixCommunication == null)
|
||||
return null;
|
||||
|
||||
var res = await citrixCommunication.RequestAsync(strUrl, retryForbidden: false);
|
||||
if (res != null)
|
||||
{
|
||||
JObject sessionInfos = res.Result;
|
||||
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
|
||||
{
|
||||
Name = constTableNameSessionStateMetrics,
|
||||
InformationClass = enumFasdInformationClass.VirtualSession,
|
||||
IsStatic = true,
|
||||
TableType = eDataHistoryTableType.Static
|
||||
};
|
||||
|
||||
var dicVals = new List<Dictionary<string, object>>();
|
||||
var vals = sessionInfos.Children();
|
||||
var metricsObj = sessionInfos["value"] as JArray;
|
||||
|
||||
if (metricsObj != null)
|
||||
{
|
||||
dicVals = metricsObj
|
||||
.OfType<JObject>()
|
||||
.Where(o =>
|
||||
o["StartDate"] != null &&
|
||||
o["ConnectionState"] != null &&
|
||||
DateTime.TryParse(o["StartDate"].ToString(), out _)
|
||||
)
|
||||
.GroupBy(o => new
|
||||
{
|
||||
Date = DateTime.Parse(o["StartDate"].ToString()).Date,
|
||||
ConnectionState = (int)o["ConnectionState"]
|
||||
})
|
||||
.OrderBy(g => g.Key.Date)
|
||||
.Select(g => new Dictionary<string, object>
|
||||
{
|
||||
{ "StartDate", g.Key.Date }, // ✅ DateTime
|
||||
{ "ConnectionState", g.Key.ConnectionState },
|
||||
{ "ConnectionCount", g.Count() }
|
||||
})
|
||||
.ToList();
|
||||
|
||||
|
||||
|
||||
|
||||
const string startDateColumnName = "StartDate";
|
||||
const string connectionStatusColumnName = "ConnectionState";
|
||||
|
||||
var groupedValues = dicVals
|
||||
.Where(v =>
|
||||
v.TryGetValue(startDateColumnName, out var collectDate) &&
|
||||
collectDate is DateTime &&
|
||||
v.TryGetValue(connectionStatusColumnName, out _))
|
||||
.GroupBy(v => new
|
||||
{
|
||||
StartDate = ((DateTime)v[startDateColumnName]).Date,
|
||||
ConnectionStatus = v[connectionStatusColumnName]
|
||||
})
|
||||
.Select(g => new Dictionary<string, object>
|
||||
{
|
||||
{ startDateColumnName, g.Key.StartDate },
|
||||
{ connectionStatusColumnName, g.Key.ConnectionStatus },
|
||||
{ "ConnectionCount", g.Count() }
|
||||
})
|
||||
.ToLookup(d => new
|
||||
{
|
||||
StartDate = (DateTime)d[startDateColumnName],
|
||||
ConnectionStatus = d[connectionStatusColumnName],
|
||||
ConnectionCount = d["ConnectionCount"]
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
for (int i = 0; i < MaxAge; i++)
|
||||
{
|
||||
DateTime referenceDate = DateTime.Now.AddDays(-i).Date;
|
||||
|
||||
//var valuesOfDay = groupedValues.FirstOrDefault(v => v.Key.Date == referenceDate);
|
||||
var valuesOfDay = groupedValues.Where(g => g.Key.StartDate == referenceDate).SelectMany(g => g).ToList();
|
||||
|
||||
foreach (var colInfo in SessionTableDetails.Columns.Values)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (valuesOfDay is null)
|
||||
{
|
||||
AddColumnData(retVal, colInfo.SourceName, ConvertToF4sdType(null, colInfo.ValueType));
|
||||
continue;
|
||||
}
|
||||
|
||||
var valuesOfColumn = valuesOfDay
|
||||
.Select(v =>
|
||||
{
|
||||
if (v.TryGetValue(colInfo.SourceName, out var colValue))
|
||||
return colValue;
|
||||
else
|
||||
return null;
|
||||
})
|
||||
.Where(v => v != null);
|
||||
|
||||
if (!valuesOfColumn.Any())
|
||||
{
|
||||
AddColumnData(retVal, colInfo.SourceName, ConvertToF4sdType(null, colInfo.ValueType));
|
||||
continue;
|
||||
}
|
||||
if (colInfo is cDataHistoryConfigColumn configColumn && configColumn.AggregationType != eDataHistoryAggregationType.Unknown)
|
||||
{
|
||||
var aggregatedValue = GetAggregationValue(valuesOfColumn, configColumn.AggregationType, colInfo.ValueType);
|
||||
AddColumnData(retVal, colInfo.SourceName, ConvertToF4sdType(aggregatedValue, colInfo.ValueType));
|
||||
}
|
||||
else
|
||||
{
|
||||
var value = valuesOfColumn.FirstOrDefault();
|
||||
AddColumnData(retVal, colInfo.SourceName, ConvertToF4sdType(value, colInfo.ValueType));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new List<cF4SDHealthCardRawData.cHealthCardTable>(1) { retVal };
|
||||
}
|
||||
else
|
||||
{
|
||||
LogEntry($"Could not get detailed sessionmetrics information from citrix with id {UserIds}. Sessionmetrics content is empty.", LogLevels.Warning);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (cPerformanceLogger.IsActive && RequestInfo != null) { cPerformanceLogger.LogPerformanceEnd(LogDeep, CM, RequestInfo.id, RequestInfo.created, _startTime); }
|
||||
if (CM != null) LogMethodEnd(CM);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
void AddColumnData(cF4SDHealthCardRawData.cHealthCardTable table, string columnName, object value)
|
||||
{
|
||||
if (table.Columns.TryGetValue(columnName, out var columnValues))
|
||||
columnValues.Values.Add(value);
|
||||
else
|
||||
table.Columns.Add(columnName, new cF4SDHealthCardRawData.cHealthCardTableColumn(table) { ColumnName = columnName, Values = new List<object>() { value } });
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<List<cF4SDHealthCardRawData.cHealthCardDetailsTable>> GetSessionMetricsDetailsIcaRttMSAsync(Guid Sessionid, string TenantId, cF4sdWebRequestInfo RequestInfo,int MaxAge, DateTime RefTime, int LogDeep, CancellationToken Token)
|
||||
{
|
||||
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
|
||||
@@ -1658,7 +1838,6 @@ namespace C4IT.DataHistoryProvider
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private async Task<List<cF4SDHealthCardRawData.cHealthCardTable>> GetSessionAsync(Guid Sessionid, string TenantId, cF4sdWebRequestInfo RequestInfo, int LogDeep, CancellationToken Token)
|
||||
{
|
||||
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
|
||||
@@ -2205,7 +2384,7 @@ namespace C4IT.DataHistoryProvider
|
||||
|
||||
if (bDcLatencyDetailExists)
|
||||
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardDetailsTable>>(async () => { return await GetSessionMetricsDetailsDcLatencyAsync(session.Id, userIds.citrixTenantId, requestInfo, MaxAge, RefTime, LogDeep + 1, Token); }));
|
||||
|
||||
|
||||
|
||||
var arrRes = await Task.WhenAll(listTasks.ToArray());
|
||||
var retVal = new List<cF4SDHealthCardRawData.cHealthCardDetailsTable>();
|
||||
@@ -2401,8 +2580,8 @@ namespace C4IT.DataHistoryProvider
|
||||
var _machineExists = Has(constTableNameSessionMachine);
|
||||
var _connectionExists = Has(constTableNameSessionConnection);
|
||||
var _currentConnectionExists = Has(constTableNameSessionCurrentConnection);
|
||||
var _sessionMetricsExists = Has(constTableNameSessionMetrics);
|
||||
|
||||
var _sessionMetricsExists = Has(constTableNameSessionMetrics);
|
||||
|
||||
var retVal = new List<cF4SDHealthCardRawData.cHealthCardTable>();
|
||||
var listTasks = new List<Task<List<cF4SDHealthCardRawData.cHealthCardTable>>>(2);
|
||||
|
||||
@@ -2420,7 +2599,7 @@ namespace C4IT.DataHistoryProvider
|
||||
//else
|
||||
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardTable>>(async () => { return await GetSessionAsync(session.Id, userIds.citrixTenantId, requestInfo, LogDeep + 1, Token); }));
|
||||
|
||||
if (_sessionMetricsExists)
|
||||
if (_sessionMetricsExists) {
|
||||
//if (CacheId == null && !instantly)
|
||||
//{
|
||||
// retVal.Add(new cF4SDHealthCardRawData.cHealthCardTable()
|
||||
@@ -2433,8 +2612,9 @@ namespace C4IT.DataHistoryProvider
|
||||
//}
|
||||
//else
|
||||
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardTable>>(async () => { return await GetSessionMetricsAsync(session.Id, userIds.citrixTenantId, requestInfo, MaxAge, LogDeep + 1, Token); }));
|
||||
|
||||
|
||||
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardTable>>(async () => { return await GetSessionStateMetricsAsync(userIds, userIds.citrixTenantId, requestInfo, MaxAge, LogDeep + 1, Token); }));
|
||||
}
|
||||
|
||||
|
||||
if (_machineExists)
|
||||
//if (CacheId == null && !instantly)
|
||||
|
||||
Reference in New Issue
Block a user