diff --git a/src/Indexer/Models/Interfaces.cs b/src/Indexer/Models/Interfaces.cs index 6721896..a157b87 100644 --- a/src/Indexer/Models/Interfaces.cs +++ b/src/Indexer/Models/Interfaces.cs @@ -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); diff --git a/src/Indexer/Models/Script.cs b/src/Indexer/Models/Script.cs index 49de21a..3471ac5 100644 --- a/src/Indexer/Models/Script.cs +++ b/src/Indexer/Models/Script.cs @@ -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 }; diff --git a/src/Indexer/Models/Worker.cs b/src/Indexer/Models/Worker.cs index 1ed757e..2c0c30b 100644 --- a/src/Indexer/Models/Worker.cs +++ b/src/Indexer/Models/Worker.cs @@ -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(); diff --git a/src/Indexer/Services/IndexerService.cs b/src/Indexer/Services/IndexerService.cs index 1f13e02..f8c08a5 100644 --- a/src/Indexer/Services/IndexerService.cs +++ b/src/Indexer/Services/IndexerService.cs @@ -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("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); } diff --git a/src/Server/Controllers/EntityController.cs b/src/Server/Controllers/EntityController.cs index b8e6c6b..b3bfe6f 100644 --- a/src/Server/Controllers/EntityController.cs +++ b/src/Server/Controllers/EntityController.cs @@ -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? 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,9 +73,10 @@ public class EntityController : ControllerBase try { searchdomain_ = _domainManager.GetSearchdomain(searchdomain); - } catch (Exception) + } catch (Exception ex) { - return Ok(new EntityListResults() {Results = [], Success = false}); + _logger.LogError("Unable to retrieve the searchdomain", [ex]); + return Ok(new EntityListResults() { Results = [], Success = false }); } EntityListResults entityListResults = new() {Results = [], Success = true}; foreach (Entity entity in searchdomain_.entityCache)