nodejs内存监控2-prometheus+grafana监控实现

nodejs内存监控2-prometheus+grafana监控实现

本文是《nodejs内存监控》监控系列的第二篇文章,主要是讲述如何基于prometheus + grafana + prom-client监控nodejs性能数据指标。node

前言

本文是基于k8s为前提,因此这边会声明一些你提早须要作得或者有的环境:git

  1. 一套k8s集群
  2. 已经提早部署了ingress
  3. 已经提早安装了helm

使用helm安装kube-prometheus-stack

prometheus是很是流行的监控服务,可是对于k8s的监控须要作不少接口,这致使了prometheus监控K8s比较复杂,官方就出了kube-prometheus这么一个项目,是Prometheus Operator的定制版,若是咱们想获取完整的k8s服务监控指标,推荐采用kube-prometheus的方式。github

其中kube-prometheus-stack集成了prometheus + grafana + alertmanage等等一些必要的服务同时内部内置了一些经常使用的k8s dashboard监控指标,咱们直接使用helm部署便可。具体部署方式再也不赘述,社区已经有很是多的部署文章。具体的部署能够参考接下来的这篇文章,讲的十分详细:express

HELM部署Prometheus operator监控k8sjson

部署成功以后,根据帐号密码进入grafana,咱们能够看到了一些kube-stack-prometheus已经默认设置好的dashboard:bootstrap

alt

点进去能看到相关的nodes, pods, k8s服务等等的许多指标信息:segmentfault

alt

node项目集成prom-client收集指标

项目集成prom-client

搭好了监控平台还不够,咱们还须要提供数据源才行,社区已经提供了很是棒的开源库prom-clinet后端

由于个人博客项目是基于nest.js搭建的,因此为了方便我这边直接使用了express-prom-bundle,这个包也是基于prom-clinet额外收集了http方面的指标数据。具体使用方法能够参考文档,接下来给出我博客后端的示例用法:api

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import * as express from 'express';
import { AppModule } from './app.module';
import ErrorFilter from '@utils/errorFilter';
import { logMiddleware, authMiddleware } from './middlewares';
import TransformInterceptor from './interceptor/transform.interceptor';
import * as promBundle from 'express-prom-bundle';
const metricsMiddleware = promBundle({
  includeMethod: true,
  customLabels: {
    app: 'blog-backend',
    version: '1.0.0',
  },
  includePath: true,
  promClient: {
    collectDefaultMetrics: {},
  },
});


async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(metricsMiddleware);
  // 处理请求数据
  app.use(express.json());
  // For parsing application/x-www-form-urlencoded
  app.use(express.urlencoded({ extended: true }));
  app.use(authMiddleware);
  app.use(logMiddleware);
  app.useGlobalFilters(new ErrorFilter());
  app.useGlobalInterceptors(new TransformInterceptor());

  // 配置 Swagger
  const options = new DocumentBuilder()
    .setTitle('xxx')
    .setDescription('xxx')
    .setVersion('1.0')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('xxx', app, document);

  await app.listen(xxx);
}

bootstrap();

复制代码

启动服务后,咱们就能经过localhost:端口号/metrics路径获取到对应的指标数据:markdown

alt

prometheus deployment配置收集数据

在上一步中,咱们经过prom-clinet获取到了基本的监控数据指标,咱们还须要让prometheus对这些数据指标进行收集。在deployment中须要添加相对应的配置:

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: APP_NAME
  name: APP_NAME
  namespace: NAMESPACE
  # service 须要声明添加prometheus监控
  annotations:
    prometheus.io/scrape: 'true'
    # prometheus获取指标协议
    prometheus.io/scheme: http
    # prometheus获取指标路径
    prometheus.io/path: /metrics
    prometheus.io/port: "80"
spec:
  ports:
    - port: 80
      targetPort: 4000
      name: APP_NAME
  selector:
    k8s-app: APP_NAME

---
# kube-stack-prometheus须要制定servicemonitor才会自动去获取数据
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: blog-backend
  namespace: monitoring
  # kube-stack-prometheus会自动获取含有 app: kube-prometheus-stack 的servicemonitor
  labels:
    release: kube-prometheus-stack
    app: kube-prometheus-stack
    release: prometheus
spec:
  endpoints:
    - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
      interval: 5s
      port: blog-backend
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
      - blog-project
  selector:
    matchLabels:
      k8s-app: blog-backend

复制代码

启动pod服务以后,咱们能够进入prometheus控制台,输入其中metrics路径中的随便一个指标process_cpu_user_seconds_total。若是有相对应的数据出现,证实prometheus已经可以成功的收集node项目的指标数据。

alt

grafana可视化数据

固然获取了数据还不行,咱们还须要把数据反映称图表信息用于查看,这时候就须要granafa了,在部署kube-stack-prometheus的时候其实grafana也自动进行了部署。

咱们只须要手动添加dashboard,而后把dashboard的json数据复制进去便可,我配置的json数据文件可在此处下载导入便可:

alt

导入完成以后,选择对应的pod就能够看到当前监控的node项目性能指标啦:

alt

相关文章
相关标签/搜索