Просмотр исходного кода

Merge pull request #2133 from weseek/imprv/es-healthcheck

Imprv/es healthcheck
Yuki Takei 6 лет назад
Родитель
Сommit
d5d432cc66

+ 1 - 1
src/server/routes/apiv3/healthcheck.js

@@ -119,7 +119,7 @@ module.exports = (crowi) => {
     const { searchService } = crowi;
     if (searchService.isConfigured) {
       try {
-        info.searchInfo = await searchService.getInfo();
+        info.searchInfo = await searchService.getInfoForHealth();
       }
       catch (err) {
         errors.push(new ErrorV3(`The Search Service is not connectable - ${err.message}`, 'healthcheck-search-unhealthy', err.stack));

+ 19 - 0
src/server/service/search-delegator/elasticsearch.js

@@ -97,6 +97,13 @@ class ElasticsearchDelegator {
     return this.normalizeIndices();
   }
 
+  /**
+   * return Nodes Info
+   * `cluster:monitor/nodes/info` privilege is required on ES
+   * @return {object} `{ esVersion, esNodeInfos }`
+   *
+   * @see https://www.elastic.co/guide/en/elasticsearch/reference/6.6/cluster-nodes-info.html
+   */
   async getInfo() {
     const info = await this.client.nodes.info();
     if (!info._nodes || !info.nodes) {
@@ -126,6 +133,18 @@ class ElasticsearchDelegator {
     return { esVersion, esNodeInfos };
   }
 
+  /**
+   * return Cluster Health
+   * `cluster:monitor/health` privilege is required on ES
+   * @return {object} `{ esClusterHealth }`
+   *
+   * @see https://www.elastic.co/guide/en/elasticsearch/reference/6.6/cluster-health.html
+   */
+  async getInfoForHealth() {
+    const esClusterHealth = await this.client.cluster.health();
+    return { esClusterHealth };
+  }
+
   /**
    * Return information for Admin Full Text Search Management page
    */

+ 16 - 7
src/server/service/search.js

@@ -7,7 +7,7 @@ class SearchService {
     this.crowi = crowi;
     this.configManager = crowi.configManager;
 
-    this.isErrorOccuredOnGettingInfo = null;
+    this.isErrorOccuredOnHealthcheck = null;
     this.isErrorOccuredOnSearching = null;
 
     try {
@@ -28,7 +28,7 @@ class SearchService {
   }
 
   get isReachable() {
-    return this.isConfigured && !this.isErrorOccuredOnGettingInfo && !this.isErrorOccuredOnSearching;
+    return this.isConfigured && !this.isErrorOccuredOnHealthcheck && !this.isErrorOccuredOnSearching;
   }
 
   get isSearchboxEnabled() {
@@ -73,25 +73,34 @@ class SearchService {
 
   async initClient() {
     // reset error flag
-    this.isErrorOccuredOnGettingInfo = false;
+    this.isErrorOccuredOnHealthcheck = false;
     this.isErrorOccuredOnSearching = false;
 
     return this.delegator.initClient();
   }
 
   async getInfo() {
+    try {
+      return await this.delegator.getInfo();
+    }
+    catch (err) {
+      logger.error(err);
+      throw err;
+    }
+  }
 
+  async getInfoForHealth() {
     try {
-      const result = await this.delegator.getInfo();
+      const result = await this.delegator.getInfoForHealth();
 
-      this.isErrorOccuredOnGettingInfo = false;
+      this.isErrorOccuredOnHealthcheck = false;
       return result;
     }
     catch (err) {
       logger.error(err);
 
-      // switch error flag, `isReachable` to be `false`
-      this.isErrorOccuredOnGettingInfo = true;
+      // switch error flag, `isErrorOccuredOnHealthcheck` to be `false`
+      this.isErrorOccuredOnHealthcheck = true;
       throw err;
     }
   }