zoukankan      html  css  js  c++  java
  • chartjs-plugin-datasource-prometheus 展示prometheus 数据

    chartjs-plugin-datasource-prometheus 是一个chartjs 的扩展,目前比较简单,只支持line图表,但是理念上好多可以借鉴

    环境准备

    • docker-compose 文件
    version: "3"
    services:
      prometheus:
        image: prom/prometheus
        volumes:
          - "./prometheus.yml:/etc/prometheus/prometheus.yml"
        command: 
        - --config.file=/etc/prometheus/prometheus.yml
        - --storage.tsdb.path=/prometheus
        - --web.console.libraries=/usr/share/prometheus/console_libraries
        - --web.console.templates=/usr/share/prometheus/consoles
        - --web.cors.origin=.*
        ports:
          - "9090:9090"
      mysql-exporter:
        image: prom/mysqld-exporter
        ports: 
        - "9104:9104"
        environment:
        - "DATA_SOURCE_NAME=root:dalongrong@(mysql:3306)/"
      grafana:
        image: grafana/grafana
        ports:
          - "3000:3000"
      gogs:
        image: gogs/gogs
        ports:
        - "10022:22"
        - "10080:3000"
      mysql:
        image: mysql:5.7.16
        ports:
          - 3306:3306
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        environment:
          MYSQL_ROOT_PASSWORD: dalongrong
          MYSQL_DATABASE: gogs
          MYSQL_USER: gogs
          MYSQL_PASSWORD: dalongrong
          TZ: Asia/Shanghai
    • promethues 配置
      prometheus.yml 文件
     
    scrape_configs:
      - job_name: mysql
        metrics_path: /metrics
        scrape_interval: 10s
        scrape_timeout: 10s
        static_configs:
          - targets: ['mysql-exporter:9104']
     
    • web
      index.html
     
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <button id="updateBtn">Update</button>
        <div style=" 500px; height: 400px;">
            <canvas id="myChart"></canvas>
            <canvas id="myChart2"></canvas>
        </div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
        <script
            src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datasource-prometheus/dist/chartjs-plugin-datasource-prometheus.umd.min.js"></script>
        <script src="main.js"></script>
    </body>
    </html>
     

    mian.js


    var ctx = document.getElementById('myChart').getContext('2d');
    var ctx2 = document.getElementById('myChart2').getContext('2d');
    const query = 'sum by (job) (mysql_global_status_buffer_pool_pages)';
    const query2 = 'sum by (job,state) (mysql_global_status_buffer_pool_pages)';
    // const query = 'node_load1';
    // // absolute
    // const start = new Date(new Date().getTime() - (60 * 60 * 1000));
    // const end = new Date();
    // relative
    const start = -30  * 60 * 1000;
    const end = 0; // now
    var myChart = new Chart(ctx, {
        type: 'line',
        data: {},
        options: {
            scales: {},
            plugins: {
                'datasource-prometheus': {
                    prometheus: {
                        endpoint: "http://localhost:9090/",
                    },
                    query: query,
                    timeRange: {
                        type: 'relative',
                        start: start,
                        end: end,
                        msUpdateInterval: 5 * 1000,
                    },
                },
            },
        },
        plugins: [
            ChartDatasourcePrometheusPlugin,
        ],
    });
    var myChart2 = new Chart(ctx2, {
        type: 'line',
        data: {},
        options: {
            scales: {},
            plugins: {
                'datasource-prometheus': {
                    prometheus: {
                        endpoint: "http://localhost:9090/",
                    },
                    query: query2,
                    timeRange: {
                        type: 'relative',
                        start: start,
                        end: end,
                        msUpdateInterval: 5 * 1000,
                    },
                },
            },
        },
        plugins: [
            ChartDatasourcePrometheusPlugin,
        ],
    });
    document.getElementById('updateBtn').addEventListener('click', () => {
        myChart.update();
    });

    启动&&效果

    • 启动
    docker-compose up -d
    • 效果

    说明

    chartjs-plugin-datasource-prometheus 功能很简单,但是对于数据展示是一个不错的借鉴,同时grafana 也是很强大的,我们
    可以参考此扩展基于prometheus 的metrics展示,实际上一种比较好的实现是基于graphql2chartjs实现展示(api 是graphql)
    对于api 我们可以使用swagger2graphql 以及graphql mesh 集成rest api,然后就可以实现更强大的数据展示了

    参考资料

    https://github.com/samber/chartjs-plugin-datasource-prometheus

  • 相关阅读:
    Linux基础命令题(ps/ls + grep)
    Operator Overloading in C++
    C++中class和struct的区别
    poj1110double vision搜索
    poj1321棋盘递归搜索
    vim窗口分割/切换
    xclipmore about copy&paste命令行粘贴
    [转载]怎样花两年时间去面试一个人
    最优二叉查找树optimalBSTC++实现
    vim复制粘贴——系统剪贴板
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/12815293.html
Copyright © 2011-2022 走看看