1. 程式人生 > 其它 >cube.js prometheus 監控

cube.js prometheus 監控

這個問題是slack 中有人問到的,同時也是社群提的比較多的,基於prometheus 的監控方案是一個很不錯的選擇
因為cube.js 是基於express 開發的,同時官方也提供了外掛擴充套件點的方法,我們可以直接使用現成的prometheus
express 擴充套件

參考配置

  • prometheus 模組
//const shrinkRay = require('shrink-ray-current');
const promMid = require('express-prometheus-middleware');
module.exports = function (app) {
    if (process.env.NODE_ENV == "production") {
        app.get("/", function (req, res) {
            res.send("oneservice api")
        })
    }
    // always use zip 
    //   app.use(shrinkRay())
    app.use(promMid({
        metricsPath: '/metrics',
        collectDefaultMetrics: true,
        requestDurationBuckets: [0.1, 0.5, 1, 1.5],
        requestLengthBuckets: [512, 1024, 5120, 10240, 51200, 102400],
        responseLengthBuckets: [512, 1024, 5120, 10240, 51200, 102400],
    }));
}
  • cube.js 使用外掛
// Cube.js configuration options: https://cube.dev/docs/config
const { DremioDriver, DremioQuery } = require("@dalongrong/mydremio-driver")
const MyS3FileRepository = require("@dalongrong/cube-s3repository")
const { schemaVersion, checkAuth, homePage } = require('./libs/oneserviceapi')
const logger = require("./libs/logger")
const cubeConf  = require("./libs/cubeConf")
module.exports = {
    basePath: "/oneserviceapi/:projectid",
    schemaVersion: schemaVersion,
    dialectFactory: (dataSource) => {
        return DremioQuery
    },
    orchestratorOptions: cubeConf.orchestratorOptions,
    logger: (msg, params) => {
        if (process.env.NODE_ENV == "production") {
            logger.log({
                level: 'info',
                message: `${JSON.stringify({ msg, ...params })}`
            });
        } else {
            console.log(`${JSON.stringify({ msg, ...params })}`)
        }
    },
    telemetry: false,
    dbType: ({ dataSource } = {}) => {
        return "mydremio"
    },
    driverFactory: ({ dataSource } = {}) => {
        return new DremioDriver({})
    },
    repositoryFactory: ({ securityContext }) => {
        return new MyS3FileRepository.S3FileRepository({
            objectPrefix: securityContext.projectId,
            bucket: securityContext.tenantId,
        })
    },
    queryRewrite: (query, { securityContext }) => {
        return query;
      },
    checkAuth: checkAuth,
    contextToAppId: ({ securityContext }) => {
        return `ONESERVICEAPP_${securityContext.projectId}`
    },
    initApp: homePage
};
  • prometheus 環境準備
version: "3"
services: 
    grafana:
      image: grafana/grafana    
      ports:
      - "3000:3000"
    prometheus:
      image: prom/prometheus
      volumes:
      - "./prometheus.yml:/etc/prometheus/prometheus.yml"
      ports:
      - "9090:9090"  

prometheus.yml

scrape_configs:
  - job_name: cubejs
    metrics_path: /metrics
    scrape_interval: 10s
    scrape_timeout: 10s
    static_configs:
      - targets: ['<hostip>:4000']

效果

  • 啟動
yarn dev
  • 效果


監控

說明

以上是一個簡單的整合,實際上還是很簡單的,而且可以方便的解決我們日常系統監控的問題,注意對於叢集模式的(node cluster )監控指標會有問題,但是也是可以湊合能用

參考資料

https://www.npmjs.com/package/express-prometheus-middleware
https://www.npmjs.com/package/prometheus-api-metrics
https://grafana.com/grafana/dashboards/14565
https://grafana.com/grafana/dashboards/12230