diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/data/DAO.java b/src/main/java/si/matjazcerkvenik/alertmonitor/data/DAO.java index 732aab0..f4e654d 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/data/DAO.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/data/DAO.java @@ -15,7 +15,6 @@ */ package si.matjazcerkvenik.alertmonitor.data; -import si.matjazcerkvenik.alertmonitor.model.config.ConfigReader; import si.matjazcerkvenik.alertmonitor.model.config.ProviderConfig; import si.matjazcerkvenik.alertmonitor.providers.AbstractDataProvider; import si.matjazcerkvenik.alertmonitor.providers.EventloggerDataProvider; @@ -38,10 +37,6 @@ public class DAO { /** A map of dataproviders. Key is name. */ private Map dataProviders = new HashMap<>(); - /** Map of warnings in the alertmonitor. */ - private Map warnings = new HashMap<>(); - - private DAO() { if (AmProps.yamlConfig != null) { @@ -163,16 +158,16 @@ public List getAllDataProviders() { // } - public void addWarning(String msgKey, String msg) { - warnings.put(msgKey, msg); - } - - public void removeWarning(String msgKey) { - warnings.remove(msgKey); + public void addWarningToAllProviders(String msgKey, String msg) { + for (AbstractDataProvider adp : dataProviders.values()) { + adp.addWarning(msgKey, msg); + } } - public List getWarnings() { - return new ArrayList<>(warnings.values()); + public void removeWarningFromAllProviders(String msgKey) { + for (AbstractDataProvider adp : dataProviders.values()) { + adp.removeWarning(msgKey); + } } } diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/data/MongoDbDataManager.java b/src/main/java/si/matjazcerkvenik/alertmonitor/data/MongoDbDataManager.java index b57df79..d78fb54 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/data/MongoDbDataManager.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/data/MongoDbDataManager.java @@ -94,12 +94,12 @@ public void addWebhookMessage(WebhookMessage message) { // insert one doc collection.insertOne(doc); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_inserts_total.labels("webhook").inc(); } catch (Exception e) { logger.error("MongoDbDataManager: addWebhookMessage: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } @@ -149,14 +149,14 @@ public List getWebhookMessages() { webhookMessageList.add(m); } - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_queries_total.labels("webhook").inc(); return webhookMessageList; } catch (Exception e) { logger.error("MongoDbDataManager: getWebhookMessages: Exception: ", e); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } return null; @@ -183,12 +183,12 @@ public void addToJournal(List events) { collection.insertMany(list, new InsertManyOptions().ordered(false)); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_inserts_total.labels("journal").inc(); } catch (Exception e) { logger.error("MongoDbDataManager: addToJournal(): Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } @@ -216,14 +216,14 @@ public List getJournal() { eventList.add(e); } - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_queries_total.labels("journal").inc(); return eventList; } catch (Exception e) { logger.error("MongoDbDataManager: getJournal: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } return null; @@ -237,14 +237,14 @@ public long getJournalSize() { MongoDatabase db = mongoClient.getDatabase(AmProps.ALERTMONITOR_MONGODB_DB_NAME); MongoCollection collection = db.getCollection("journal"); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_queries_total.labels("journal").inc(); return collection.countDocuments(); } catch (Exception e) { logger.error("MongoDbDataManager: getJournalSize: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } return -1; @@ -260,14 +260,14 @@ public int getNumberOfAlertsInLastHour() { Bson filter = Filters.gte("timestamp", System.currentTimeMillis() - 3600 * 1000); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_queries_total.labels("journal").inc(); return (int) collection.countDocuments(filter); } catch (Exception e) { logger.error("MongoDbDataManager: getNumberOfAlertsInLastHour: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } return -1; @@ -292,13 +292,13 @@ public DEvent getEvent(String id) { Document doc = collection.find(Filters.eq("uid", id)).first(); DEvent event = convertToDEvent(doc); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); AmMetrics.alertmonitor_db_queries_total.labels("journal").inc(); return event; } catch (Exception e) { logger.error("MongoDbDataManager: getEvent: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } return null; @@ -360,11 +360,11 @@ public void cleanDB() { logger.info("MongoDbDataManager: cleanDB [journal]: result" + resultDeleteMany2); AmMetrics.alertmonitor_db_deletes_total.labels("journal").inc(); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); } catch (Exception e) { logger.error("MongoDbDataManager: cleanDB: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } } @@ -385,11 +385,11 @@ public void handleAlarmClearing(DEvent clearEvent) { logger.info("MongoDbDataManager: handleAlarmClearing: result" + updateResult); AmMetrics.alertmonitor_db_updates_total.labels("journal").inc(); - DAO.getInstance().removeWarning("mongo"); + DAO.getInstance().removeWarningFromAllProviders("mongo"); } catch (Exception e) { logger.error("MongoDbDataManager: handleAlarmClearing: Exception: " + e.getMessage()); - DAO.getInstance().addWarning("mongo", "No connection to DB"); + DAO.getInstance().addWarningToAllProviders("mongo", "No connection to DB"); AmMetrics.alertmonitor_db_failures_total.labels().inc(); } } diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClient.java b/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClient.java index 4aeb6b4..e03781a 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClient.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClient.java @@ -19,6 +19,8 @@ import com.google.gson.GsonBuilder; import okhttp3.*; import si.matjazcerkvenik.alertmonitor.data.DAO; +import si.matjazcerkvenik.alertmonitor.providers.AbstractDataProvider; +import si.matjazcerkvenik.alertmonitor.providers.PrometheusDataProvider; import si.matjazcerkvenik.alertmonitor.util.AmMetrics; import si.matjazcerkvenik.alertmonitor.util.AmProps; import si.matjazcerkvenik.alertmonitor.util.HttpClientFactory; @@ -41,33 +43,33 @@ public class PrometheusApiClient { private final SimpleLogger logger = LogFactory.getLogger(); - /** Name of this client - provider name */ - private String name = ".default"; - private final String HTTP_CLIENT_USER_AGENT = "Alertmonitor/v1"; private static long requestCount; + private AbstractDataProvider dataProvider; + + /* Extracted from providerConfig */ + /** Name of this client - provider name */ + private String name = ".default"; private String server; private boolean secureClient = false; private int connectTimeout = 10; private int readTimeout = 120; - public PrometheusApiClient(boolean secure, int connectTimeout, int readTimeout, String server) { - this.secureClient = secure; - this.connectTimeout = connectTimeout; - this.readTimeout = readTimeout; - this.server = server; + public PrometheusApiClient(AbstractDataProvider dataProvider) { + this.dataProvider = dataProvider; + name = dataProvider.getProviderConfig().getName(); + server = dataProvider.getProviderConfig().getParam(PrometheusDataProvider.DP_PARAM_KEY_SERVER); + secureClient = server.startsWith("https"); + connectTimeout = Integer.parseInt(dataProvider.getProviderConfig().getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_CONNECT_TIMEOUT_SEC)); + readTimeout = Integer.parseInt(dataProvider.getProviderConfig().getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_READ_TIMEOUT_SEC)); } public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - /** * Execute a simple query * @param query the query @@ -271,32 +273,32 @@ private String execute(Request request) throws PrometheusApiException { response.close(); - DAO.getInstance().removeWarning("prom_api"); + dataProvider.removeWarning("prom_api"); } catch (UnknownHostException e) { logger.error("PrometheusApi[" + name + "]: request[" + requestCount + "] failed: UnknownHostException: " + e.getMessage()); code = "0"; - DAO.getInstance().addWarning("prom_api", "Prometheus API not reachable"); + dataProvider.addWarning("prom_api", "Prometheus API not reachable"); throw new PrometheusApiException("Unknown Host"); } catch (SocketTimeoutException e) { logger.error("PrometheusApi[" + name + "]: request[" + requestCount + "] failed: SocketTimeoutException: " + e.getMessage()); code = "0"; - DAO.getInstance().addWarning("prom_api", "Prometheus API not reachable"); + dataProvider.addWarning("prom_api", "Prometheus API not reachable"); throw new PrometheusApiException("Timeout"); } catch (SocketException e) { logger.error("PrometheusApi[" + name + "]: request[" + requestCount + "] failed: SocketException: " + e.getMessage()); code = "0"; - DAO.getInstance().addWarning("prom_api", "Prometheus API not reachable"); + dataProvider.addWarning("prom_api", "Prometheus API not reachable"); throw new PrometheusApiException("Socket Error"); } catch (SSLException e) { logger.error("PrometheusApi[" + name + "]: request[" + requestCount + "] failed: SSLException: " + e.getMessage()); code = "0"; - DAO.getInstance().addWarning("prom_api", "Prometheus API not reachable"); + dataProvider.addWarning("prom_api", "Prometheus API not reachable"); throw new PrometheusApiException("SSL Exception"); } catch (Exception e) { logger.error("PrometheusApi[" + name + "]: request[" + requestCount + "] failed: Exception: ", e); code = "0"; - DAO.getInstance().addWarning("prom_api", "Prometheus API not reachable"); + dataProvider.addWarning("prom_api", "Prometheus API not reachable"); throw new PrometheusApiException("Unknown Exception"); } finally { double duration = (System.currentTimeMillis() - before) * 1.0 / 1000; diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClientPool.java b/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClientPool.java index cb4594b..447a091 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClientPool.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/model/prometheus/PrometheusApiClientPool.java @@ -15,6 +15,8 @@ */ package si.matjazcerkvenik.alertmonitor.model.prometheus; +import si.matjazcerkvenik.alertmonitor.providers.AbstractDataProvider; +import si.matjazcerkvenik.alertmonitor.providers.PrometheusDataProvider; import si.matjazcerkvenik.alertmonitor.util.LogFactory; import java.util.ArrayList; @@ -25,10 +27,10 @@ public class PrometheusApiClientPool { private int count = 0; private List pool = new ArrayList<>(); - public PrometheusApiClientPool(String name, int poolSize, boolean secure, int connectTimeout, int readTimeout, String server) { + public PrometheusApiClientPool(AbstractDataProvider dataProvider) { + Integer poolSize = Integer.parseInt(dataProvider.getProviderConfig().getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_POOL_SIZE)); for (int i = 0; i < poolSize; i++) { - PrometheusApiClient c = new PrometheusApiClient(secure, connectTimeout, readTimeout, server); - c.setName(name); + PrometheusApiClient c = new PrometheusApiClient(dataProvider); pool.add(c); } } diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/providers/AbstractDataProvider.java b/src/main/java/si/matjazcerkvenik/alertmonitor/providers/AbstractDataProvider.java index fac5270..ea38f31 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/providers/AbstractDataProvider.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/providers/AbstractDataProvider.java @@ -43,6 +43,9 @@ public abstract class AbstractDataProvider { protected Timer syncTimer = null; + /** Map of warnings in this data provider. */ + private Map warnings = new HashMap<>(); + protected long webhookMessagesReceivedCount = 0; protected long journalReceivedCount = 0; protected long lastEventTimestamp = 0; @@ -66,13 +69,7 @@ public void setProviderConfig(ProviderConfig providerConfig) { public void init() { // TODO error handling! LogFactory.getLogger().info(providerConfig.toString()); - String server = providerConfig.getParam(PrometheusDataProvider.DP_PARAM_KEY_SERVER); - Boolean secure = server.startsWith("https"); - Integer poolSize = Integer.parseInt(providerConfig.getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_POOL_SIZE)); - Integer connTimeout = Integer.parseInt(providerConfig.getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_CONNECT_TIMEOUT_SEC)); - Integer readTimeout = Integer.parseInt(providerConfig.getParam(PrometheusDataProvider.DP_PARAM_KEY_CLIENT_READ_TIMEOUT_SEC)); - - prometheusApiClientPool = new PrometheusApiClientPool(providerConfig.getName(), poolSize, secure, connTimeout, readTimeout, server); + prometheusApiClientPool = new PrometheusApiClientPool(this); restartSyncTimer(); } @@ -102,10 +99,6 @@ public List getJournal() { return DAO.getInstance().getDataManager().getJournal(); } - public long getJournalSize() { - return DAO.getInstance().getDataManager().getJournalSize(); - } - public DEvent getEvent(String id) { DEvent event = DAO.getInstance().getDataManager().getEvent(id); return event; @@ -350,6 +343,18 @@ public List getActiveTargets() { return new ArrayList<>(map.keySet()); } + public void addWarning(String msgKey, String msg) { + warnings.put(msgKey, msg); + } + + public void removeWarning(String msgKey) { + warnings.remove(msgKey); + } + + public List getWarnings() { + return new ArrayList<>(warnings.values()); + } + public abstract void restartSyncTimer(); public long getWebhookMessagesReceivedCount() { @@ -360,6 +365,10 @@ public long getJournalCount() { return journalReceivedCount; } + public long getJournalSize() { + return DAO.getInstance().getDataManager().getJournalSize(); + } + public long getLastEventTimestamp() { return lastEventTimestamp; } diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/providers/PrometheusSyncTask.java b/src/main/java/si/matjazcerkvenik/alertmonitor/providers/PrometheusSyncTask.java index f91a6a9..2465721 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/providers/PrometheusSyncTask.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/providers/PrometheusSyncTask.java @@ -57,7 +57,7 @@ public void run() { logger.error("SYNC: null response returned"); logger.info("SYNC: === Periodic synchronization complete ==="); dataProvider.syncFailedCount++; - DAO.getInstance().addWarning("sync", "Synchronization is failing"); + dataProvider.addWarning("sync", "Synchronization is failing"); return; } @@ -138,13 +138,13 @@ public void run() { dataProvider.syncSuccessCount++; AmMetrics.alertmonitor_sync_success.labels(dataProvider.providerConfig.getName()).set(1); - DAO.getInstance().removeWarning("sync"); + dataProvider.removeWarning("sync"); } catch (Exception e) { logger.error("SYNC: failed to synchronize alarms; root cause: " + e.getMessage()); dataProvider.syncFailedCount++; AmMetrics.alertmonitor_sync_success.labels(dataProvider.providerConfig.getName()).set(0); - DAO.getInstance().addWarning("sync", "Synchronization is failing"); + dataProvider.addWarning("sync", "Synchronization is failing"); } finally { dataProvider.getPrometheusApiClientPool().returnClient(api); } diff --git a/src/main/java/si/matjazcerkvenik/alertmonitor/web/uibeans/UiConfigBean.java b/src/main/java/si/matjazcerkvenik/alertmonitor/web/uibeans/UiConfigBean.java index 0f5357f..8645cd1 100644 --- a/src/main/java/si/matjazcerkvenik/alertmonitor/web/uibeans/UiConfigBean.java +++ b/src/main/java/si/matjazcerkvenik/alertmonitor/web/uibeans/UiConfigBean.java @@ -223,26 +223,31 @@ public String reloadPrometheusAction() { /* STATISTICS */ public long getWhMsgCount() { + // TODO moved to provider AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); return adp.getWebhookMessagesReceivedCount(); } public long getJournalCount() { + // TODO moved to provider AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); return adp.getJournalCount(); } public long getJournalSize() { + // TODO moved to provider AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); return adp.getJournalSize(); } public long getAlarmsCount() { + // TODO moved to provider AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); return adp.getRaisingEventCount(); } public long getClearsCount() { + // TODO moved to provider AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); return adp.getClearingEventCount(); } @@ -323,8 +328,9 @@ public String getTimeSinceLastEvent() { } public List getWarnings() { - if (DAO.getInstance().getWarnings().size() == 0) return null; - return DAO.getInstance().getWarnings(); + AbstractDataProvider adp = DAO.getInstance().getDataProvider(selectedDataProvider); + if (adp.getWarnings().size() == 0) return null; + return adp.getWarnings(); } public String getCurrentTime() { diff --git a/src/main/webapp/WEB-INF/taglib/warnings.xhtml b/src/main/webapp/WEB-INF/taglib/warnings.xhtml index 4d12e3f..5d89f55 100644 --- a/src/main/webapp/WEB-INF/taglib/warnings.xhtml +++ b/src/main/webapp/WEB-INF/taglib/warnings.xhtml @@ -4,7 +4,7 @@ xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"> - + diff --git a/src/main/webapp/about/about.xhtml b/src/main/webapp/about/about.xhtml index df5a16d..707f485 100644 --- a/src/main/webapp/about/about.xhtml +++ b/src/main/webapp/about/about.xhtml @@ -33,6 +33,20 @@
+
+
+
+ + + + + /journal +
+ /webhook-io +
+ /metrics + +
diff --git a/src/main/webapp/providers/providers.xhtml b/src/main/webapp/providers/providers.xhtml index 47e359d..e5363df 100644 --- a/src/main/webapp/providers/providers.xhtml +++ b/src/main/webapp/providers/providers.xhtml @@ -25,6 +25,16 @@ + + + + + + + + + + @@ -33,6 +43,55 @@ + + + + + + +

Active alerts

+ + + + + + +
+ + +

Counters

+ + + + + + +
+ + +

Timers

+ + + + + + +
+ + +

Sync

+ + + + + + +
+ +
+ + + diff --git a/src/main/webapp/statistics/stats.xhtml b/src/main/webapp/statistics/stats.xhtml index 86ab095..866721a 100644 --- a/src/main/webapp/statistics/stats.xhtml +++ b/src/main/webapp/statistics/stats.xhtml @@ -9,14 +9,6 @@
- - - - - - - - @@ -67,27 +59,7 @@ -
- - - - - - -
-
- - - - - /journal -
- /webhook-io -
- /metrics - -
diff --git a/src/main/webapp/test/test.xhtml b/src/main/webapp/test/test.xhtml index cc1a05a..047c5b8 100644 --- a/src/main/webapp/test/test.xhtml +++ b/src/main/webapp/test/test.xhtml @@ -9,6 +9,14 @@
+ + + + + + +
+