private static async Task InsertEventsInInfluxDb(IEnumerable <FXEvent> events, string clientId, string appKey, string backendAddress, string backendAppUri, TraceWriter log) { try { BackendFXEventsConnector connector = (new MonitoringServerConnector(clientId, appKey, backendAddress, backendAppUri)).FXEventsConnector; string host = GetEnvironmentVariable("InfluxDB:Host"); string dbName = GetEnvironmentVariable("InfluxDB:Name"); string user = GetEnvironmentVariable("InfluxDB:User"); var result = await connector.InsertInOnSiteInfluxDB(events, host, dbName, user); if (result.Success) { log.Info($"Successfully added/updated {events.Count()} in onsite InfluxDB"); } else { log.Error($"Failed to add/update {events.Count()} in onsite InfluxDB: {result.Message}"); } } catch (Exception ex) { log.Error($"Failed to insert events in InfluxDB: {ex.Message}"); } }
private static async Task PostEventsToMonitoringBackendServer(List <FXEvent> events) { try { events.Sort(new FXEventTimeComparer()); DateTimeOffset min = events.Select(e => e.Timestamp).Min(); DateTimeOffset max = events.Select(e => e.Timestamp).Max(); string clientId = GetEnvironmentVariable("Monitoring:ClientId"); string appKey = GetEnvironmentVariable("Monitoring:AppKey"); string backendAddress = GetEnvironmentVariable("Monitoring:BackendAddress"); string backendAppUri = GetEnvironmentVariable("Monitoring:BackendAppIdUri"); BackendFXEventsConnector connector = (new MonitoringServerConnector(clientId, appKey, backendAddress, backendAppUri)).FXEventsConnector; List <FXEvent> existing = await connector.GetInTimeRange(min, max); if (existing.IsNullOrEmpty()) { logger.Info("Found no existing events in DB. Will add the whole batch as new events"); foreach (var fxEvent in events) { var result = await connector.AddOrUpdate(fxEvent); if (!result.Success) { logger.Error($"Failed to add event '{fxEvent.Title}': {result.Message}"); } } logger.Info($"Successfully processed {events.Count} events"); } else { logger.Info($"Found {existing.Count} existing events in DB between {min} and {max}"); List <FXEvent> toProcess = new List <FXEvent>(); var toAdd = events.Except(existing, FXEventEqualityComparer.Instance); if (!toAdd.IsNullOrEmpty()) { logger.Info($"Found {toAdd.Count()} new events that are not in DB. Will add them"); foreach (var fxEvent in toAdd) { logger.Info($"\t{FormatFXEvent(fxEvent)}"); } toProcess.AddRange(toAdd); } var toCheck = events.Intersect(existing, FXEventEqualityComparer.Instance); if (!toCheck.IsNullOrEmpty()) { logger.Info($"Found {toCheck.Count()} events already in DB. Will check them one by one"); foreach (var fxEvent in toCheck) { var updated = events.First(e => e.Timestamp == fxEvent.Timestamp && e.Title == fxEvent.Title && e.Currency == fxEvent.Currency); var current = existing.First(e => e.Timestamp == fxEvent.Timestamp && e.Title == fxEvent.Title && e.Currency == fxEvent.Currency); if (updated.Actual != current.Actual || updated.Explanation != current.Explanation || updated.Forecast != current.Forecast || updated.Level != current.Level || updated.Previous != current.Previous) { logger.Info($"Event {FormatFXEvent(fxEvent)} was updated on DailyFX and needs to be updated in the DB"); logger.Info($"\tPrev level: {current.Level}, New level: {updated.Level}"); logger.Info($"\tPrev explanation: {current.Explanation}, New explanation: {updated.Explanation}"); logger.Info($"\tPrev forecast: {current.Forecast}, New forecast: {updated.Forecast}"); logger.Info($"\tPrev previous: {current.Previous}, New previous: {updated.Previous}"); logger.Info($"\tPrev actual: {current.Actual}, New actual: {updated.Actual}"); toProcess.Add(fxEvent); } } } if (!toProcess.IsNullOrEmpty()) { foreach (var fxEvent in toProcess) { var result = await connector.AddOrUpdate(fxEvent); if (!result.Success) { logger.Error($"Failed to add event '{fxEvent.Title}': {result.Message}"); } } logger.Info($"Successfully processed {toProcess.Count} events"); } else { logger.Info("All events received from DailyFX, but none was found to be new or updated. Nothing to add/update in DB"); } } } catch (Exception ex) { logger.Error($"Failed to process events: {ex}"); } }
private FXEventManager() { fxEventsConnector = App.MonitoringServerConnector.FXEventsConnector; }