Example #1
0
        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}");
            }
        }
Example #2
0
        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}");
            }
        }
Example #3
0
 private FXEventManager()
 {
     fxEventsConnector = App.MonitoringServerConnector.FXEventsConnector;
 }