【Express.js】健康检查

news/2024/7/19 12:29:34 标签: express, javascript, 后端

健康检查

许多时候,我们需要对应用进行监控,来获取他的详细状态,这节介绍几个在 express 中进行健康检查的方案。

亲自手写

亲自创建一些路由,根据情况返回应用的相关信息,不过自己写比较麻烦,除非有特别的需求,一般我们就用第三方的解决方案。

expressactuator_8">express-actuator

express-actuator.js 是一个现成的用于 express 的健康检查中间件:

npm install express-acutator --save

配置express-actuator:
在你的主应用中引入 actuator 即可:

javascript">const actuator = require('express-actuator');

const app = express();

app.use(actuator({
  basePath: '/actuator',
  infoGitMode: 'simple',
  // infoBuildOptions: null, // extra information you want to expose in the build object. Requires an object.
  // infoDateFormat: null, // by default, git.commit.time will show as is defined in git.properties. If infoDateFormat is defined, moment will format git.commit.time. See https://momentjs.com/docs/#/displaying/format/.
  customEndpoints: [] // array of custom endpoints
}));

其中有一些配置选项:

  • basePath: actuator的基路由,如果不设置,则其所有路由(“/info”, “health”, “metrics”)将挂载在 app 的路由上
  • infoGitMode: 暴露的Git信息, ‘simple’ 或者 ‘full’
  • infoBuildOptions: 额外暴露的信息
  • infoDateFormat: Git提交信息的时间格式
  • customEndpoints: 自定义端点(初始仅提供了"/info", “health”, “metrics”)

访问端点:

  • “/info”:会包含你的项目信息(从 package.json 读取)和Git信息,如:
{
    "build": {
        "description": "This is my new app",
        "name": "MyApp",
        "version": "1.0.0"
    },
    "git": {
        "branch": "master",
        "commit": {
            "id": "329a314",
            "time": "2016-11-18 08:16:39-0500"
        }
    }
}
  • “/metrics”:express 应用的健康详情,如:
{
    "mem": {
        "rss": 39350272,
        "heapTotal": 11038720,
        "heapUsed": 8889952,
        "external": 892742,
        "arrayBuffers": 32982
    },
    "uptime": 58.3234052
}
  • “/health”:当下的健康状况,如:
{
    "status": "UP"
}

lightship

lightship.js 也是一个不错的健康检查工具,并且可以与 Kubernetes 集成:

npm install lightship --save

不过与 express-actuator 不同的是,express-actuator是挂载在 express 应用上的中间件,而 lightship 是自己单独开辟一个 http 服务器(即额外占用一个端口):

javascript">async function start() {
  const config = require('./config').get();
  const init = require('./init');
  await init();
  const express = require('express');
  const jsTextChart = require('js-text-chart');
  const logger = require('./utils/logger');
  const server = require('./utils/server');
  const Lightship = await import('lightship');
  const createLightship = Lightship.createLightship;
  
  const app = require('./app');
  const lightship = await createLightship({
    detectKubernetes: false,
    port: 8081,
    // gracefulShutdownTimeout, // 优雅停机时间
    // gracefulShutdownTimeout, // 优雅停机延迟
    // shutdownHandlerTimeout, // 停机Handler时间
    // signals, // An a array of [signal events]{@link https://nodejs.org/api/process.html#process_signal_events}. Default: [SIGTERM].
    // terminate // Default: `() => { process.exit(1) };`
  });
  
  server.on('request', app);
  server.listen(config.app.port, config.app.host, async() => {
    let host = server.address().address;
    let port = server.address().port;
  
    let str = config.app.name;
    let mode = [ "close", "far", undefined ];
    let chart = jsTextChart.convert(str, mode[0]);
    console.log(chart);
  
    console.log("Server is ready on http://%s:%s", host, port);

    lightship.registerShutdownHandler(() => {
      lightship.shutdown();
      server.close();
    })
    
    lightship.signalReady();
  });
}

start();

其中有一些配置选项:

  • detectKubernetes 是否探查 Kubernates
  • port lightship服务器端口
  • gracefulShutdownTimeout 优雅停机前时间
  • gracefulShutdownTimeout 优雅停机延迟时间
  • shutdownHandlerTimeout 停机Handler前时间
  • signals 标记
  • terminate 用于shutdown停机的函数

访问端点:

  • “/health”: 健康状况,有如下几种返回:
    • 200 status code, message “SERVER_IS_READY” 服务器就绪
    • 500 status code, message “SERVER_IS_NOT_READY” 服务器正在初始化
    • 500 status code, message “SERVER_IS_SHUTTING_DOWN” 服务器挂了
  • “/live”: 还活着吗,有如下几种返回:
    • 200 status code, message “SERVER_IS_NOT_SHUTTING_DOWN”.
    • 500 status code, message “SERVER_IS_SHUTTING_DOWN”.
  • “/ready”: 是否就绪,有如下几种返回:
    • 200 status code, message “SERVER_IS_READY”.
    • 500 status code, message “SERVER_IS_NOT_READY”.

Kubernates

Kubernates 提供了两个健康检查服务:liveness 和 readiness,你可以将 express 部署到 Kubernates 容器中。


http://www.niftyadmin.cn/n/5013273.html

相关文章

人大金仓分析型数据库备份和恢复(一)

目录 前言 备份和恢复概述 并行备份 非并行备份 需求和限制 前言 定期执行备份能确保在数据损坏或者系统失效发生时能恢复数据或者重建数据库系统。用户还可以使用备份从一个数据库系统迁移数据到另一个数据库系统。 备份和恢复概述 数据库支持并行和非并行的方法来备份和…

sqlserver2012 bat脚本实现最大使用内存设置

前言 安装完成sqlserver之后,在运行过程中会无限制的占用电脑的内存,会影响到其他软甲的使用。 bat脚本 准备好bat脚本和sql文件之后,配置好数据库信息 直接双击即可 ECHO OFF REM 自动判断权限问题,主动获取管理员权限>…

面试求职-简历编写技巧

没有高水平简历 只有高匹配的简历 试问一下:如果一个非常牛逼的软件工程的硕士,投递市场营销岗位,结果会是什么样呢? 这位同学大概率没办法通过简历。 不是因为他不够优秀,而是因为简历和岗位不够匹配。 在公司的招…

java应用CPU飙高的排查思路及解决方案

1、使用top命令查看系统cpu占用情况,找出占用最高的进程pid top 2、使用如下命令查找进程内占用cpu最高的线程id ps H -eo pid,tid,%cpu | grep 最高的进程pid查询出进程内2276这个线程占用cpu最高 # pid(进程id)、tid(线程id&…

CPU与GPU的区别与协作

CPU和GPU区别以及如何协同工作 CPU是Central Processing Unit的缩写,意思是中央处理器,它是计算机的核心部件,负责执行各种程序和指令,处理各种数据和逻辑。CPU通常由控制单元、运算单元、寄存器、缓存等组成,它可以根…

成型vue3项目引入electron通信

成型vue3项目引入electron通信 1、cnpm i electron --save-dev 安装electron之后,要使用electron里面的ipcRenderer模块,在调用的时候,使用require引入electron会报错,fs.existsSync is not a function或者Uncaught ReferenceErr…

电脑磁盘分区形式是什么?如何更改?

磁盘分区形式介绍 在了解为什么以及如何更改分区形式之前,让我们对磁盘分区形式有一个基本的了解。一般来说,分区形式是指主引导记录(MBR)和 GUID 分区表(GPT)。 MBR和GPT是Windows系统中常用…

神经网络输出中间特征图

在进行神经网络的训练过程中,会生成不同的特征图信息,这些特征图中包含大量图像信息,如轮廓信息,细节信息等,然而,我们一般只获取最终的输出结果,至于中间的特征图则很少关注。 前两天师弟突然…