Improved logging
This commit is contained in:
@@ -4,7 +4,7 @@ public interface IScriptable
|
||||
{
|
||||
ScriptToolSet ToolSet { get; set; }
|
||||
ScriptUpdateInfo UpdateInfo { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
ILogger _logger { get; set; }
|
||||
void Init();
|
||||
void Update(ICallbackInfos callbackInfos);
|
||||
bool IsScript(string filePath);
|
||||
|
||||
@@ -11,10 +11,10 @@ public class PythonScriptable : IScriptable
|
||||
public dynamic sys;
|
||||
public string source;
|
||||
public ScriptUpdateInfo UpdateInfo { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
public ILogger _logger { get; set; }
|
||||
public PythonScriptable(ScriptToolSet toolSet, ILogger logger)
|
||||
{
|
||||
Logger = logger;
|
||||
_logger = logger;
|
||||
Runtime.PythonDLL = @"libpython3.12.so";
|
||||
if (!PythonEngine.IsInitialized)
|
||||
{
|
||||
@@ -56,11 +56,11 @@ public class PythonScriptable : IScriptable
|
||||
UpdateInfo = new() { DateTime = DateTime.Now, Successful = false, Exception = ex };
|
||||
if (retryCounter < 3)
|
||||
{
|
||||
Logger.LogWarning("Unable to init the scriptable - retrying", [ToolSet.filePath, ex]);
|
||||
_logger.LogWarning("Unable to init the scriptable - retrying", [ToolSet.filePath, ex]);
|
||||
retryCounter++;
|
||||
goto retry;
|
||||
}
|
||||
Logger.LogError("Unable to init the scriptable", [ToolSet.filePath, ex]);
|
||||
_logger.LogError("Unable to init the scriptable", [ToolSet.filePath, ex]);
|
||||
throw;
|
||||
}
|
||||
UpdateInfo = new() { DateTime = DateTime.Now, Successful = true };
|
||||
@@ -85,11 +85,11 @@ public class PythonScriptable : IScriptable
|
||||
UpdateInfo = new() { DateTime = DateTime.Now, Successful = false, Exception = ex };
|
||||
if (retryCounter < 3)
|
||||
{
|
||||
Logger.LogWarning("Execution of script failed to an exception - retrying", [ToolSet.filePath, ex]);
|
||||
_logger.LogWarning("Execution of script failed to an exception - retrying", [ToolSet.filePath, ex]);
|
||||
retryCounter++;
|
||||
goto retry;
|
||||
}
|
||||
Logger.LogError("Execution of script failed to an exception", [ToolSet.filePath, ex]);
|
||||
_logger.LogError("Execution of script failed to an exception", [ToolSet.filePath, ex]);
|
||||
throw;
|
||||
}
|
||||
UpdateInfo = new() { DateTime = DateTime.Now, Successful = true };
|
||||
|
||||
@@ -82,17 +82,19 @@ public class IntervalCall : ICall
|
||||
{
|
||||
public System.Timers.Timer Timer;
|
||||
public IScriptable Scriptable;
|
||||
|
||||
public IntervalCall(System.Timers.Timer timer, IScriptable scriptable)
|
||||
public ILogger _logger;
|
||||
public IntervalCall(System.Timers.Timer timer, IScriptable scriptable, ILogger logger)
|
||||
{
|
||||
Timer = timer;
|
||||
Scriptable = scriptable;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public HealthCheckResult HealthCheck()
|
||||
{
|
||||
if (!Scriptable.UpdateInfo.Successful)
|
||||
{
|
||||
_logger.LogWarning("HealthCheck revealed: The last execution of \"{name}\" was not successful", Scriptable.ToolSet.filePath);
|
||||
return HealthCheckResult.Unhealthy();
|
||||
}
|
||||
double timerInterval = Timer.Interval; // In ms
|
||||
@@ -101,6 +103,7 @@ public class IntervalCall : ICall
|
||||
double millisecondsSinceLastExecution = now.Subtract(lastRunDateTime).TotalMilliseconds;
|
||||
if (millisecondsSinceLastExecution >= 2 * timerInterval)
|
||||
{
|
||||
_logger.LogWarning("HealthCheck revealed: Since the last execution of \"{name}\" more than twice the interval has passed", Scriptable.ToolSet.filePath);
|
||||
return HealthCheckResult.Unhealthy();
|
||||
}
|
||||
return HealthCheckResult.Healthy();
|
||||
|
||||
@@ -17,14 +17,21 @@ public class IndexerService : IHostedService
|
||||
this.client = client;
|
||||
this.workerCollection = workerCollection;
|
||||
_logger = logger;
|
||||
_logger.LogInformation("Initializing IndexerService");
|
||||
// Load and configure all workers
|
||||
var sectionMain = _config.GetSection("EmbeddingsearchIndexer");
|
||||
if (!sectionMain.Exists())
|
||||
{
|
||||
_logger.LogCritical("Unable to load section \"EmbeddingsearchIndexer\"");
|
||||
throw new IndexerConfigurationException("Unable to load section \"EmbeddingsearchIndexer\"");
|
||||
}
|
||||
|
||||
WorkerCollectionConfig? sectionWorker = (WorkerCollectionConfig?)sectionMain.Get(typeof(WorkerCollectionConfig)); //GetValue<WorkerCollectionConfig>("Worker");
|
||||
if (sectionWorker is not null)
|
||||
{
|
||||
foreach (WorkerConfig workerConfig in sectionWorker.Worker)
|
||||
{
|
||||
_logger.LogInformation("Initializing worker: {Name}", workerConfig.Name);
|
||||
if (client.searchdomain == "" && workerConfig.Searchdomains.Count >= 1)
|
||||
{
|
||||
client.searchdomain = workerConfig.Searchdomains.First();
|
||||
@@ -34,11 +41,14 @@ public class IndexerService : IHostedService
|
||||
workerCollection.Workers.Add(worker);
|
||||
foreach (CallConfig callConfig in workerConfig.Calls)
|
||||
{
|
||||
_logger.LogInformation("Initializing call of type: {Type}", callConfig.Type);
|
||||
|
||||
switch (callConfig.Type)
|
||||
{
|
||||
case "interval":
|
||||
if (callConfig.Interval is null)
|
||||
{
|
||||
_logger.LogError("Interval not set for a Call in Worker \"{Name}\"", workerConfig.Name);
|
||||
throw new IndexerConfigurationException($"Interval not set for a Call in Worker \"{workerConfig.Name}\"");
|
||||
}
|
||||
var timer = new System.Timers.Timer((double)callConfig.Interval);
|
||||
@@ -50,12 +60,13 @@ public class IndexerService : IHostedService
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError("Exception occurred in a Call of Worker \"{name}\": \"{ex}\"", worker.Name, ex.Message);
|
||||
httpContextAccessor.HttpContext.RaiseError(ex);
|
||||
}
|
||||
};
|
||||
timer.AutoReset = true;
|
||||
timer.Enabled = true;
|
||||
IntervalCall call = new(timer, worker.Scriptable);
|
||||
IntervalCall call = new(timer, worker.Scriptable, _logger);
|
||||
worker.Calls.Add(call);
|
||||
break;
|
||||
case "schedule": // TODO implement scheduled tasks using Quartz
|
||||
@@ -63,6 +74,7 @@ public class IndexerService : IHostedService
|
||||
case "fileupdate":
|
||||
if (callConfig.Path is null)
|
||||
{
|
||||
_logger.LogError("Path not set for a Call in Worker \"{Name}\"", workerConfig.Name);
|
||||
throw new IndexerConfigurationException($"Path not set for a Call in Worker \"{workerConfig.Name}\"");
|
||||
}
|
||||
throw new NotImplementedException("fileupdate not implemented yet");
|
||||
@@ -75,7 +87,8 @@ public class IndexerService : IHostedService
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IndexerConfigurationException("Unable to find section \"Worker\"");
|
||||
_logger.LogCritical("Unable to load section \"Worker\"");
|
||||
throw new IndexerConfigurationException("Unable to load section \"Worker\"");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,6 +103,7 @@ public class IndexerService : IHostedService
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
_logger.LogError("Unable to determine the script's language: \"{fileName}\"", fileName);
|
||||
|
||||
throw new UnknownScriptLanguageException(fileName);
|
||||
}
|
||||
|
||||
@@ -47,8 +47,9 @@ public class EntityController : ControllerBase
|
||||
{
|
||||
searchdomain_ = _domainManager.GetSearchdomain(searchdomain);
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError("Unable to retrieve the searchdomain", [ex]);
|
||||
return Ok(new EntityIndexResult() { Success = false });
|
||||
}
|
||||
List<Entity>? entities = searchdomain_.EntitiesFromJSON(JsonSerializer.Serialize(jsonEntity));
|
||||
@@ -59,7 +60,7 @@ public class EntityController : ControllerBase
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogDebug("Unable to deserialize an entity");
|
||||
_logger.LogError("Unable to deserialize an entity");
|
||||
}
|
||||
|
||||
return Ok(new EntityIndexResult() { Success = false });
|
||||
@@ -72,8 +73,9 @@ public class EntityController : ControllerBase
|
||||
try
|
||||
{
|
||||
searchdomain_ = _domainManager.GetSearchdomain(searchdomain);
|
||||
} catch (Exception)
|
||||
} catch (Exception ex)
|
||||
{
|
||||
_logger.LogError("Unable to retrieve the searchdomain", [ex]);
|
||||
return Ok(new EntityListResults() { Results = [], Success = false });
|
||||
}
|
||||
EntityListResults entityListResults = new() {Results = [], Success = true};
|
||||
|
||||
Reference in New Issue
Block a user