aktueller stand

This commit is contained in:
Meik
2026-02-03 16:47:06 +01:00
parent 82984f769b
commit d289fc4c21
21 changed files with 1603 additions and 1141 deletions

View File

@@ -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)