快速接入业务监控体系,grafana监控的艺术

  做一个系统,如果不做监控,是不完善的。

  如果为做一个快速系统,花力气去做监控,是不值得的。

  因为,我们有必要具备一个能够快速建立监控体系的能力。即使你只是一个普通开发人员!

个人觉得,做监控有三个核心能力:

  1. 持续收集数据的能力; (时间序列数据库)
  2. 监控结果可视化的能力;
  3. 异常监控可报警的能力;

  只要把这三点做到了,那么,这个监控基本就成功了。

  既然自己不方便做监控系统,那就只要好框架造型就可以了。

  因grafana的图表功能个人感觉最强大,我们就以 grafana 作为监控抓手点,创建自己的监控体系吧!

监控体系大体实现思路:

  1. 代码里写入埋点,或者其他系统通过探针之类的工具实现数据源;
  2. 监控数据中心接收埋点数据等指标数据集;
  3. 监控中心提供各种维度数据的计算汇总指标;
  4. 自定义图表展现;
  5. 根据结果设置报警;

具体打开方法:

  1. 写代码添加埋点;
  2. 使用jmx采集工具采集数据;
  3. 安装 prometheus, 配置好要调用的客户端;
  4. 安装grafana;
  5. 配置 prometheus 的数据源到 grafana 上;
  6. 添加 grafana 监控图表;
  7. 配置监控报警(一般你需要先配置linux邮件设置);

所以,看下具体怎么做吧,涉及到安装的部分就顺带过吧,毕竟其他地方信息已经泛滥了!

1. 撸埋点代码(jmx)

  .1 引入依赖包

        <!-- jmx 埋点依赖 -->
        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-jmx</artifactId>
            <version>4.0.0</version>
        </dependency>

  .2 封装指标上报工具类

import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jmx.JmxReporter;
import org.springframework.stereotype.Component;

/**
 * 系统指标管理管理器实现类
 *
 */
@Component
public class SystemMetricsManagerImpl implements SystemMetricsManager {

    private static final MetricRegistry metricsContainer = new MetricRegistry();

    static {
        JmxReporter jmxReporter = JmxReporter.forRegistry(metricsContainer).build();
        jmxReporter.start();
    }

    @Override
    public Meter registerAndGetMetricMeter(String meterName) {
        return metricsContainer.meter(meterName);
    }
}

  .3 在需要的地方添加埋点

    // 在必要的地方,进行集中初始化
    @Override
    public void afterPropertiesSet() throws Exception {
        consumeCounterHolder = new ConsumeCounterHolder();
        consumeCounterHolder.initCounter();
    }

    /**
     * 计数器容器实例
     */
    private ConsumeCounterHolder consumeCounterHolder;

    /**
     * 消费计数器容器
     */
    class ConsumeCounterHolder {

        /**
         * 所有消费计数器
         */
        private Meter totalConsumeCounter;

        /**
         * 被抛弃的消费计数器
         */
        private Meter msgDiscardConsumeCounter;

        /**
         * 系统异常消费计数器
         */
        private Meter systemExceptionConsumeCounter;

        /**
         * 业务消费失败,回滚计数器 (一般不会存在值)
         */
        private Meter processFailedConsumeCounter;

        /**
         * 停止消费计数器
         */
        private Meter listenerStoppedConsumeCounter;

        /**
         * 未知类型消费数计数器
         */
        private Meter unknownTypeConsumeCounter;

        /**
         * 初始化计数器
         */
        public void initCounter() {
            totalConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.TOTAL_COUNT_METRIC_NAME);
            msgDiscardConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.DISCARD_COUNT_METRIC_NAME);
            systemExceptionConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.SYSTEM_EXCEPTION_COUNT_METRIC_NAME);
            processFailedConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.PROCESS_FAILED_COUNT_METRIC_NAME);
            listenerStoppedConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.LISTENER_STOPPED_COUNT_METRIC_NAME);
            unknownTypeConsumeCounter = systemMetricsManager.registerAndGetMetricMeter(
                    ApolloHubSystemMetricsConstants.MqConsumeCounter.UNKNOWN_TYPE_COUNT_METRIC_NAME);
        }

        /**
         * 增加消费计数
         */
        private void incTotalConsumeCounter() {
            totalConsumeCounter.mark();
        }
        public void incMsgDiscardConsumeCounter() {
            msgDiscardConsumeCounter.mark();
        }
        public void incSystemExceptionConsumeCounter() {
            systemExceptionConsumeCounter.mark();
        }
        public void incProcessFailedConsumeCounter() {
            processFailedConsumeCounter.mark();
        }
        public void incListenerStoppedConsumeCounter() {
            listenerStoppedConsumeCounter.mark();
        }
        public void incUnknownTypeConsumeCounter() {
            unknownTypeConsumeCounter.mark();
        }
    }

    /**
     * 业务方法中,调用埋点
     *
     */
    public void doSth() {
        // 添加各种埋点
        consumeCounterHolder.incTotalConsumeCounter();
    }

2. 使用jmx采集工具采集数据 (prometheus)

  prometheus 作为流行的监控组件,可以很方便的接入 jmx 数据, 使用 jmxReporter 就可以了。

  prometheus 项目地址: https://github.com/prometheus

  jmxReporter 项目地址: https://github.com/prometheus/jmx_exporter

  下载 jmxReporter agent: https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.11.0/jmx_prometheus_javaagent-0.11.0.jar

  添加最简单的配置文件,采集所有jmx数据:

# vim config.yaml
---
rules:
- pattern: ".*"

  最后,启动 jmxReporter, 提供采集依据:

    java -javaagent:./jmx_prometheus_javaagent-0.11.0.jar=9088:config.yaml -jar yourJar.jar

  注: jmxReporter 的原理其实是开启一个http的socket端口,在外部请求进来之后,进行访问jmx数据进行返回。

3. 安装prometheus服务端,进行主动数据采集

  .1 下载: https://prometheus.io/download/ , 找到对应版本下载即可;
  .2 直接启动验证下: ./prometheus --config.file=prometheus.yml --web.enable-admin-api
  .3 向 prometheus 中添加客户端机器地址,以便采集,我们只使用一种简单的独立文件的配置方式:

# 1. 直接在文件末尾添加job即可
  - job_name: ‘jmx-apollo-hub‘

    file_sd_configs:
    - files:
      - conf.d/test.json

# 2. 在 conf.d/test.json 中,添加相应的客户端机器ip
[
    {
        "targets": ["10.1.1.1:9088"]
    },{
        "targets": ["10.1.1.2:9088"]
    },{
        "targets": ["10.1.1.3:9088"]
    }
]

  .4 重启 prometheus

    kill -9 xxx
    ./prometheus --config.file=prometheus.yml --web.enable-admin-api

  如此, prometheus 的数据库中就已经有 你的埋点数据了!

4. 安装 grafana

  .1 下载地址: https://grafana.com/get
  .2 可以直接使用镜像源安装,也可以使用源码包自行编译;
  .3 启动 grafana 服务: service grafana-server start
  .4 你就可以打开 grafana 后台进行查看了(默认账号密码是 admin/admin);

5. 新增 prometheus 作为 grafana 的数据源

  grafana 支持很多数据源的接入,但是 prometheus 是比较简单的一种;

  在设置 -> DataSources 中,添加 prometheus 的数据,按要求填写即可,一般只需要填写一个 prometheus 的请求地址就可以了。

  

6. 添加 grafana 监控图表;

  直接点击 + 号,添加一个大盘;

  然后就是各种页面拖拉拽!

  拿几个需要注意的指标统计说明下:

# case1. 代码中的埋点为一个递增的值,我想知道每段时间的增长趋势是怎么样的?如: 1分钟
    increase(metrics_test_mq_consume_total_Count[1m])
# case2. 在集群环境中,以上统计将是所有机器的总和,我想查看单个机器的增长趋势?
    increase(metrics_test_mq_consume_total_Count{instance=~"$instance_cust"}[1m])    # 其中 instance_cust 是定义在监控大盘上的自定义变量,其作用是 当前监控的实例的标识, 稍后我们看下实例
# case3. 我想知道下当前机器的cpu负载
    avg_over_time(java_lang_OperatingSystem_SystemCpuLoad{instance=~"$instance_cust"}[1m]) * 100
# case4. 我想查看当前机器的物理内存情况
    java_lang_OperatingSystem_FreePhysicalMemorySize{instance=~"$instance_cust"}
    java_lang_OperatingSystem_TotalPhysicalMemorySize{instance=~"$instance_cust"}
# case5. 我想查看jvm的内存情况
    java_lang_Memory_HeapMemoryUsage_max{instance=~"$instance_cust"}
    java_lang_Memory_HeapMemoryUsage_used{instance=~"$instance_cust"}

    # 附: 添加大盘 通用变量
    label_values(up{job=‘jmx‘}, instance) 将会查询符合过滤条件的标签
    

  附: 添加大盘 通用变量

  label_values(up{job=‘jmx‘}, instance) 将会查询符合过滤条件的标签

7. 配置监控报警(一般你需要先配置linux邮件设置);

  以上都配置好之后,还可以进行报警配置。

  alerting -> Notification Channels 中,添加告警通知通道。

  然后,在原来的大盘中选择一个指标进行报警设置;然后就可以接收告警了。

  当然,这里选择邮件,需要linux系统直接使用 mail 进行发送邮件才行。

  

  如此,一个完整的监控链完成!

老话: 愿你戎马半生,归来仍是少年。

原文地址:https://www.cnblogs.com/yougewe/p/11140129.html

时间: 2024-10-09 23:02:15

快速接入业务监控体系,grafana监控的艺术的相关文章

监控 体系

## 监控的必要性 > 在一个IT环境中会存在各种各样的设备,比如:硬件设备,软件设备,系统环境,运行服务.那么在这么复杂的环境下,尤其是大公司里成千上万的服务器我们如何去管理和维护呢?如何能保证公司资源的正常运转?我们通过什么手段去及时掌握基础环境和业务应用的可用性?如何获取到各组件的运行状态(如:CPU使用率,内存的使用率,硬盘的使用率,服务是否运行正常,端口是否存在,带宽流量以及网站访问的状态码),公司业务扩展需要增加服务器又该如何操作呢?等等这些问题都需要有一个系统的工具来帮助我们实现-

中小企业监控体系构建实战(转载)

中小企业监控体系构建实战 高效运维 | 2015-10-28 07:26 编辑 高浩淼(整理) 作者介绍 赵舜东 江湖人称赵班长,曾在武警某部负责指挥自动化的架构和运维工作,2008年退役后一直从事互联网运维工作.曾带团队负责国内某食品电商的运维工作,即将出版的<saltstack入门与实践>作者之一. 主题简介 我们今天的话题是<中小企业监控体系构建实战>,前期分享了<中小企业自动化部署实战>还没有看到的朋友可以先阅读下,这样也能明白为何要定位中小企业.监控这个话题实

如何建立起一套有效的APP监控体系

概论: 移动APP有着自己独特的运行环境和使用场景,相比后端服务,移动APP质量同样需要做到可视.可控.移动APP是近几年刚刚出现的新产品形态,如何保障 移动APP质量是一个新的挑战和话题.今天,我们重点介绍APP端问题如何发现.如何定位.如何止损,以及如何建立起一套有效的监控体系,为APP稳定应用保驾护航.分为"端问题概述.端质量监控方案.端监控能力建设"三个章节. 1端问题概述 app客户端产品上线前,会经过全面而且严谨的测试再发布到应用商店.但,发布后产品质量如何,以往更多地依赖

cAdvisor+Prometheus+Grafana监控docker

cAdvisor+Prometheus+Grafana监控docker 一.cAdvisor(需要监控的主机都要安装) 官方地址:https://github.com/google/cadvisor CAdvisor是谷歌开发的用于分析运行中容器的资源占用和性能指标的开源工具.CAdvisor是一个运行时的守护进程,负责收集.聚合.处理和输出运行中容器的信息.注意在查找相关资料后发现这是最新版cAdvisor的bug,换成版本为google/cadvisor:v0.24.1 就ok了,映射主机端

[运维] 第七篇:数据中心监控体系建设方法论

无论是传统数据中心,还是云时代的数据中心,运维监控都是运维工作的重点,而且运维监控是一个整体,你必须尽可能监控的全面和深入,你的监控数据才会更有价值,例如你想监控业务应用,可是如果没有基础监控数据(OS.数据库.中间件.网络等),你觉得你的监控会到位吗?那么如何建设一个全面和深入的监控体系呢?        首先看监控体系的规划:              再看监控体系的梳理:           监控体系的落地思路:            监控体系建设的持续改进:           监控是一

数据库监控体系建设(一)

这篇文章先总结一下数据库监控体系建设那些事儿,下一篇文章描述具体的详细部署过程 1. 背景 作为核心IT业务模块,数据库的重要性毋庸置疑,数据库的稳定运行直接关系到应用系统的可用.稳定.高效性.因此,为确保数据库稳定.高效的运行,我们需要面临如下两个挑战 1.        数据库运行过程中的危险因子,怎么及时发现? 2.        数据库发生故障或因某些原因导致处于不正常工作状态时,怎样及时发现? 为了解决上述的两个难点,必须建立数据库监控体系,7*24实时监控数据库的运行状态,在数据库即

使用Prometheus+Grafana监控MySQL实践

Grafana+Prometheus打造全方位立体监控系统 一.介绍Prometheus Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作.Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus.现在最常见的Kubernetes容器管理系统中,通常会搭配Promet

使用telegraf+influxdb+grafana监控ceph集群

telegraf是一个收集监控项的agent,有支持收集多种数据的插件比如ceph,apache,docker,haproxy,system等,同时有支持多种输出的插件比如influxdb,graphite等. influxdb是时序数据库,多用于监控场景 grafana是很棒的绘图工具 这三者的结合有三个主要过程: 1.安装在ceph集群所有节点(包括mon和osd节点)上的telegraf通过ceph_input插件收集ceph集群信息,这里踩了两个坑,ceph_input插件报了两个错,一

Windows 10的TPM模块到底是不是美国全球监控体系的奠基石?

http://bbs.pediy.com/showthread.php?t=202638 http://www.zhihu.com/topic/19671262/newest 2015年3月18日,微软宣布与腾讯.360等国内几家知名互联网企业达成战略合 作,可通过其旗下产品直接将现在的盗版或正版XP.Win7.Win8.x等系统一键升级到最新的正版Win10,2015年7月29日就将发布并开启下 载该操作系统的桌面正式版本.实际上,升级后的Win10操作系统采用的可信计算模块(Trusted