Merge pull request #2541 from long2ice/master
feat: support redis monitor
This commit is contained in:
		
						commit
						6437ef198f
					
				
					 5 changed files with 198 additions and 2 deletions
				
			
		
							
								
								
									
										153
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										153
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							|  | @ -53,6 +53,7 @@ | |||
|                 "prometheus-api-metrics": "~3.2.1", | ||||
|                 "protobufjs": "~7.1.1", | ||||
|                 "redbean-node": "0.1.4", | ||||
|                 "redis": "~4.5.1", | ||||
|                 "socket.io": "~4.5.3", | ||||
|                 "socket.io-client": "~4.5.3", | ||||
|                 "socks-proxy-agent": "6.1.1", | ||||
|  | @ -3455,6 +3456,64 @@ | |||
|             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", | ||||
|             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" | ||||
|         }, | ||||
|         "node_modules/@redis/bloom": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz", | ||||
|             "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==", | ||||
|             "peerDependencies": { | ||||
|                 "@redis/client": "^1.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@redis/client": { | ||||
|             "version": "1.4.2", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", | ||||
|             "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", | ||||
|             "dependencies": { | ||||
|                 "cluster-key-slot": "1.1.1", | ||||
|                 "generic-pool": "3.9.0", | ||||
|                 "yallist": "4.0.0" | ||||
|             }, | ||||
|             "engines": { | ||||
|                 "node": ">=14" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@redis/client/node_modules/yallist": { | ||||
|             "version": "4.0.0", | ||||
|             "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | ||||
|             "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" | ||||
|         }, | ||||
|         "node_modules/@redis/graph": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", | ||||
|             "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", | ||||
|             "peerDependencies": { | ||||
|                 "@redis/client": "^1.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@redis/json": { | ||||
|             "version": "1.0.4", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", | ||||
|             "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", | ||||
|             "peerDependencies": { | ||||
|                 "@redis/client": "^1.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@redis/search": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", | ||||
|             "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==", | ||||
|             "peerDependencies": { | ||||
|                 "@redis/client": "^1.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@redis/time-series": { | ||||
|             "version": "1.0.4", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", | ||||
|             "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", | ||||
|             "peerDependencies": { | ||||
|                 "@redis/client": "^1.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/@sideway/address": { | ||||
|             "version": "4.1.4", | ||||
|             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", | ||||
|  | @ -5399,6 +5458,14 @@ | |||
|                 "node": ">=6" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/cluster-key-slot": { | ||||
|             "version": "1.1.1", | ||||
|             "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", | ||||
|             "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", | ||||
|             "engines": { | ||||
|                 "node": ">=0.10.0" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/co": { | ||||
|             "version": "4.6.0", | ||||
|             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", | ||||
|  | @ -8317,6 +8384,14 @@ | |||
|                 "is-property": "^1.0.2" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/generic-pool": { | ||||
|             "version": "3.9.0", | ||||
|             "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", | ||||
|             "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", | ||||
|             "engines": { | ||||
|                 "node": ">= 4" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/gensync": { | ||||
|             "version": "1.0.0-beta.2", | ||||
|             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", | ||||
|  | @ -14283,6 +14358,19 @@ | |||
|                 "node": ">=8" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/redis": { | ||||
|             "version": "4.5.1", | ||||
|             "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", | ||||
|             "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", | ||||
|             "dependencies": { | ||||
|                 "@redis/bloom": "1.1.0", | ||||
|                 "@redis/client": "1.4.2", | ||||
|                 "@redis/graph": "1.1.0", | ||||
|                 "@redis/json": "1.0.4", | ||||
|                 "@redis/search": "1.1.0", | ||||
|                 "@redis/time-series": "1.0.4" | ||||
|             } | ||||
|         }, | ||||
|         "node_modules/regenerate": { | ||||
|             "version": "1.4.2", | ||||
|             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", | ||||
|  | @ -19714,6 +19802,48 @@ | |||
|             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", | ||||
|             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" | ||||
|         }, | ||||
|         "@redis/bloom": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz", | ||||
|             "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==" | ||||
|         }, | ||||
|         "@redis/client": { | ||||
|             "version": "1.4.2", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", | ||||
|             "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", | ||||
|             "requires": { | ||||
|                 "cluster-key-slot": "1.1.1", | ||||
|                 "generic-pool": "3.9.0", | ||||
|                 "yallist": "4.0.0" | ||||
|             }, | ||||
|             "dependencies": { | ||||
|                 "yallist": { | ||||
|                     "version": "4.0.0", | ||||
|                     "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | ||||
|                     "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "@redis/graph": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", | ||||
|             "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==" | ||||
|         }, | ||||
|         "@redis/json": { | ||||
|             "version": "1.0.4", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", | ||||
|             "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==" | ||||
|         }, | ||||
|         "@redis/search": { | ||||
|             "version": "1.1.0", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", | ||||
|             "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==" | ||||
|         }, | ||||
|         "@redis/time-series": { | ||||
|             "version": "1.0.4", | ||||
|             "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", | ||||
|             "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==" | ||||
|         }, | ||||
|         "@sideway/address": { | ||||
|             "version": "4.1.4", | ||||
|             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", | ||||
|  | @ -21316,6 +21446,11 @@ | |||
|                 "is-regexp": "^2.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "cluster-key-slot": { | ||||
|             "version": "1.1.1", | ||||
|             "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", | ||||
|             "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==" | ||||
|         }, | ||||
|         "co": { | ||||
|             "version": "4.6.0", | ||||
|             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", | ||||
|  | @ -23433,6 +23568,11 @@ | |||
|                 "is-property": "^1.0.2" | ||||
|             } | ||||
|         }, | ||||
|         "generic-pool": { | ||||
|             "version": "3.9.0", | ||||
|             "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", | ||||
|             "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" | ||||
|         }, | ||||
|         "gensync": { | ||||
|             "version": "1.0.0-beta.2", | ||||
|             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", | ||||
|  | @ -27902,6 +28042,19 @@ | |||
|                 "strip-indent": "^3.0.0" | ||||
|             } | ||||
|         }, | ||||
|         "redis": { | ||||
|             "version": "4.5.1", | ||||
|             "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", | ||||
|             "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", | ||||
|             "requires": { | ||||
|                 "@redis/bloom": "1.1.0", | ||||
|                 "@redis/client": "1.4.2", | ||||
|                 "@redis/graph": "1.1.0", | ||||
|                 "@redis/json": "1.0.4", | ||||
|                 "@redis/search": "1.1.0", | ||||
|                 "@redis/time-series": "1.0.4" | ||||
|             } | ||||
|         }, | ||||
|         "regenerate": { | ||||
|             "version": "1.4.2", | ||||
|             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", | ||||
|  |  | |||
|  | @ -110,6 +110,7 @@ | |||
|         "prometheus-api-metrics": "~3.2.1", | ||||
|         "protobufjs": "~7.1.1", | ||||
|         "redbean-node": "0.1.4", | ||||
|         "redis": "~4.5.1", | ||||
|         "socket.io": "~4.5.3", | ||||
|         "socket.io-client": "~4.5.3", | ||||
|         "socks-proxy-agent": "6.1.1", | ||||
|  |  | |||
|  | @ -3,7 +3,9 @@ const dayjs = require("dayjs"); | |||
| const axios = require("axios"); | ||||
| const { Prometheus } = require("../prometheus"); | ||||
| const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } = require("../../src/util"); | ||||
| const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server"); | ||||
| const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery, | ||||
|     redisPingAsync | ||||
| } = require("../util-server"); | ||||
| const { R } = require("redbean-node"); | ||||
| const { BeanModel } = require("redbean-node/dist/bean-model"); | ||||
| const { Notification } = require("../notification"); | ||||
|  | @ -617,6 +619,12 @@ class Monitor extends BeanModel { | |||
|                         } | ||||
|                     } | ||||
|                     bean.ping = dayjs().valueOf() - startTime; | ||||
|                 } else if (this.type === "redis") { | ||||
|                     let startTime = dayjs().valueOf(); | ||||
| 
 | ||||
|                     bean.msg = await redisPingAsync(this.databaseConnectionString); | ||||
|                     bean.status = UP; | ||||
|                     bean.ping = dayjs().valueOf() - startTime; | ||||
|                 } else { | ||||
|                     bean.msg = "Unknown Monitor Type"; | ||||
|                     bean.status = PENDING; | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ const { Settings } = require("./settings"); | |||
| const grpc = require("@grpc/grpc-js"); | ||||
| const protojs = require("protobufjs"); | ||||
| const radiusClient = require("node-radius-client"); | ||||
| const redis = require("redis"); | ||||
| const { | ||||
|     dictionaries: { | ||||
|         rfc2865: { file, attributes }, | ||||
|  | @ -354,6 +355,30 @@ exports.radius = function ( | |||
|     }); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Redis server ping | ||||
|  * @param {string} dsn The redis connection string | ||||
|  */ | ||||
| exports.redisPingAsync = function (dsn) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         const client = redis.createClient({ | ||||
|             url: dsn, | ||||
|         }); | ||||
|         client.on("error", (err) => { | ||||
|             reject(err); | ||||
|         }); | ||||
|         client.connect().then(() => { | ||||
|             client.ping().then((res, err) => { | ||||
|                 if (err) { | ||||
|                     reject(err); | ||||
|                 } else { | ||||
|                     resolve(res); | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Retrieve value of setting based on key | ||||
|  * @param {string} key Key of setting to retrieve | ||||
|  |  | |||
|  | @ -60,6 +60,9 @@ | |||
|                                         <option value="radius"> | ||||
|                                             Radius | ||||
|                                         </option> | ||||
|                                         <option value="redis"> | ||||
|                                             Redis | ||||
|                                         </option> | ||||
|                                     </optgroup> | ||||
|                                 </select> | ||||
|                             </div> | ||||
|  | @ -267,7 +270,13 @@ | |||
|                                     <textarea id="sqlQuery" v-model="monitor.databaseQuery" class="form-control" placeholder="Example: select getdate()"></textarea> | ||||
|                                 </div> | ||||
|                             </template> | ||||
| 
 | ||||
|                             <!-- Redis --> | ||||
|                             <template v-if="monitor.type === 'redis'"> | ||||
|                                 <div class="my-3"> | ||||
|                                     <label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label> | ||||
|                                     <input id="redisConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port"> | ||||
|                                 </div> | ||||
|                             </template> | ||||
|                             <!-- Interval --> | ||||
|                             <div class="my-3"> | ||||
|                                 <label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue