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

相關文章
相關標籤/搜索