- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到 github.com/HobbyBear/performance-analyze ,接下来这段时间我将在之前内容的基础上,结合自己在公司生产上构建监控系统的经验,详细的展示如何对线上服务进行监控,内容涉及到的指标设计,软件配置,监控方案等等你都可以拿来直接复刻到你的项目里,这是一套非常适合中小企业的监控体系.
在上一节我们其实是建立起了对监控的概念,对监控什么,如何监控有了大致的印象。这一节我们就要正式开始动手实践了,这一节我会介绍下项目代码的结构以及着重介绍下其中docker-compose的配置文件.
完整代码我已经上传到了github 。
github.com/HobbyBear/easymonitor
为了后面章节的介绍更加清晰,我在这一节还是介绍下整个项目各个目录以及含义 。
(base) ➜ easymonitor git:(main) ✗ tree -L 1
.
├── ReadMe.md
├── build.sh // 对webhookserver 以及 webapp 项目进行编译 ,然后放到program文件夹里
├── docker-compose.yaml // 启动各个监控系统组件
├── filebeat.yml // filebeat日志采集的配置文件
├── go.mod
├── go.sum
├── grafanadashbord // 放置grafana的监控面板导出的json文件,可直接启动项目,然后导入json文件,即可构建监控面板
├── infra // 项目基础组件的代码,因为服务的监控有时会涉及到埋点和prometheus client暴露指标,将这部分逻辑都写在这个包下,后续新应用只要引入这个包就能拥有这些监控指标
├── logconf // 放置主机上的日志采集配置文件,filebeat.yml 中会引入这个文件夹下的配置规则做不同的采集策略
├── logs // 放置应用服务日志的目录,由于是docker-compose启动,需要将主机这个目录同时映射到filebeat和应用服务容器,filebeat会对这个目录下的日志进行采集
├── logstash.conf // logstash 配置文件
├── program // 放置webhookserver 以及 webapp 项目编译好的二进制文件
├── prometheus.yml // prometheus 配置文件
├── webapp // 应用服务代码
└── alerterserver // 模拟自研报警系统代码
由于机器有限,我准备用docker-compose来构建我们需要用到的监控组件以及应用服务。回顾下监控架构图.
我们需要的组件或者服务有,应用服务(在项目代码里是webapp),filebeat,prometheus,logstash,elasticsearch,kibana, grafana,node exporter , 自研的报警服务(在项目代码里是alerterserver) 。
可以看到,在实际的生产环境中,应用服务和filebeat,node exporter是在同一台主机上,共享了linux命名空间,直接用docker-compose 启动各个组件不好模拟这种情况,所以为了更加真实的模拟, 我对node exporter 启动容器的配置做了简单修改,让项目代码里的logs目录同时映射到filebeat容器和node exporter容器内部,并且让应用程序代码在node exporter容器里启动,这样filebeat从logs目录采集到的日志就是应用程序webapp打的日志了 .
为了让node exporter 容器镜像启动时也会运行webapp程序,我修改了其启动容器时的entrypoint配置,因为node exporter本来的entrypoint是要去运行node exporter进程的,现在修改为要运行一个脚本.
version: "3.7"
services:
mynode:
image: prom/node-exporter:latest
container_name: "node0"
hostname: "mynode"
ports:
- "9100:9100"
- "8080:8080"
- "8090:8090"
volumes:
- "./program:/program"
- "./logs:/logs"
restart: always
entrypoint: "sh /program/start_node_exporter.sh"
脚本内则是将webapp和node exporter同时启动起来,脚本是放置在项目program 目录里,映射到了 容器内部。 webapp通过8090端口暴露prometheus 指标信息,通过8080端口监听http请求。9100端口是node exporter服务监听的端口。脚本内容如下
#!/bin/bash
nohup /program/webapp &
node_exporter --collector.vmstat --collector.tcpstat --collector.processes
完整的 docker-compose 配置文件如下
version: "3.7"
services:
mynode:
image: prom/node-exporter:latest
container_name: "node0"
hostname: "mynode"
ports:
- "9100:9100"
- "8080:8080"
- "8090:8090"
volumes:
- "./program:/program"
- "./logs:/logs"
restart: always
entrypoint: "sh /program/start_node_exporter.sh"
prometheus:
image: prom/prometheus:latest
container_name: "prometheus0"
restart: always
ports:
- "9090:9090"
volumes:
- "./prometheus.yml:/etc/prometheus/prometheus.yml"
grafana:
image: grafana/grafana
container_name: "grafana0"
ports:
- "3000:3000"
restart: always
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.14.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:7.14.2
container_name: kibana
ports:
- "5601:5601"
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
filebeat:
image: docker.elastic.co/beats/filebeat:7.14.2
container_name: filebeat
user: root
volumes:
- ./logs:/logs
- ./logconf:/logconf
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml
command: filebeat -e -d "*"
depends_on:
- elasticsearch
- logstash
logstash:
image: docker.elastic.co/logstash/logstash:7.14.2
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
depends_on:
- elasticsearch
mem_reservation: 1000M
cpu_count: 1
ubuntu:
image: ubuntu
command: ./alerterserver
ports:
- "16060:16060"
volumes:
- "./program:/program"
working_dir: /program
mydb:
restart: always
image: amd64/mysql:latest
container_name: mydb
environment:
- "MYSQL_ROOT_PASSWORD=1234567"
- "MYSQL_DATABASE=test"
ports:
- "3306:3306"
需要注意的是其中 卷映射 的配置,我们挨个来看下映射了哪些配置文件.
首先是prometheus 将项目代码里的prometheus.yml 映射到prometheus容器内部,prometheus.yml 里面配置要采集的对象,如下所示,我们需要对主机以及应用服务进行指标采集.
## prometheus.yml
global:
scrape_interval: 15s # 默认抓取周期
scrape_configs:
- job_name: 'normal' ## 对node exporter 进行采集
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['mynode:9100']
- job_name: 'webapp' ## 对应用服务指标进行采集
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: [ 'mynode:8090' ]
relabel_configs:
- source_labels: [ __address__ ]
target_label: instance
regex: (.*):\d+
replacement: $1
然后是filebeat,映射了3个卷,分别是项目代码里的logs目录,这个目录是filebeat的采集日志目录,filebeat配置的采集规则将从这个目录采集日志。配置的规则放到了logconf目录下,以下是配置规则文件示例
## logconf/api.yml
- type: log
tail_files: true // 该配置为true,为了让filebeat启动的时候对新增的日志才进行采集,对历史日志不进行采集
paths:
- /logs/**.log
fields:
log_type: project1
除此以外,filebeat还将项目代码里的filebeat.yml 配置文件映射到了filebeat容器内.
接着是logstash 容器配置,它映射了项目代码里的logstash 配置文件,这个文件主要是定义了一些日志清洗规则,已经定义日志的输入来源和输出来源,在这个系统里,输入来源就是filebeat,输出来源就是elasticsearch.
然后是ubuntu这个容器,映射了项目代码里的program 目录,program这个目录下放置了alerterserver报警服务的二进制程序,ubuntu容器就是前台启动这个程序,16060端口就是报警服务监听的端口.
通过下面两个命令,我们就可以启动整个监控系统 。
(base) ➜ easymonitor git:(main) ✗ sh build.sh
(base) ➜ easymonitor git:(main) ✗ docker-compose up
接着,服务启动之后,在浏览器输入 localhost:3000就可以 访问grafana的界面了,默认账号和密码都是admin,点击左边菜单栏选择Data sources .
注意prometheus的的ip地址要换成你本地机器局域的ip,因为docker-compose启动的每个容器拥有各自的网络命名空间,要访问其他容器的进程,就得用容器的ip+端口,不过我们本地机器映射了相同端口且容器和本地机器是互通的,所以ip地址填成本地机器局域网ip即可.
你也可以用prometheus关键字替换ip地址,变成http://prometheus:9090 ,因为docker-compose启动的进程默认可以用配置文件中的容器名代替ip地址进行访问.
配置好数据源以后,就可以正式对系统进行监控了,正如前一节 【升职加薪秘籍】我在服务监控方面的实践(1)-监控蓝图 所说,监控是分级的,所以我们建立监控系统指标时,也是这样,在下一节,我会首先介绍如何在操作系统,服务器层面建立起系统的监控,并定制一个自己的dash board.
在万千人海中,相遇就是缘分,为了这份缘分,给作者点个赞👍🏻不过分吧.
最后此篇关于【升职加薪秘籍】我在服务监控方面的实践(2)-监控组件配置的文章就讲到这里了,如果你想了解更多关于【升职加薪秘籍】我在服务监控方面的实践(2)-监控组件配置的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经在 ubuntu 14.0 上成功安装了 Zabbix 3.2 服务器主机上的 Z 是绿色的。不幸的是,JMX 是红色的。 Zabbix 服务器:192.168.1.112 带有 tomcat
我想制作一个仪表板,显示我们的 Azure 服务总线队列的状态,并显示“添加到队列的消息”、“队列长度”和“已处理的消息”等的历史记录。使用 Azure 管理门户,我可以看到,这些统计信息大部分是手动
我的 MYSQL 每天晚上都有事件,但我不太确定发生了什么,因为即使我将其设置得早于其他事件,它仍然在早上运行。 问题是,我如何检查运行事件的历史记录或日志,哪一个晚上锁了,哪一个是跑了没跑? 谢谢
1、监控log文件大小超过10g的server 和db 复制代码代码如下: create procedure db_sendmail_mssqllogsize as&n
本教程讨论如何使用 AspectJ 开源框架监控 Spring 应用程序在方法执行方面的性能。 传统上,监控每个 Java 方法所花费的时间的最简单方法是在方法的开头和结尾包含一些跟踪行: publi
有什么可以帮助 msmq 监控的吗?当消息出现在队列中并且在休假时相同时,我想获得一些事件/监视器。 最佳答案 查看 Windows 管理性能计数器。 如果您查看管理工具并找到“性能计数器”,您将能够
我的 Tomcat 中的一个巨大的 web 应用程序有时会开始使用过多的 DBCP 连接,从而导致问题。 为了进行调查,我想在每个时间点准确地知道什么线程/方法持有池的连接。不需要是实时的,事后分析就
在浏览器的整个页面生命周期中监视 cookie 并在 cookie 更改时触发事件的最佳 JS 或 JQuery 特定方法是什么? 最佳答案 据我所知,不可能将 change (或类似)事件直接绑定(
我想尽可能详细地报告我的笔记本的执行情况。简而言之,我想实时查看我的笔记本正在执行的每个操作。例如,我的一个函数有一个 sleep 周期为 5 秒的循环,我希望看到程序实际上正在 sleep 并且循环
Azure 容器服务是否与 Azure Monitor 集成?想知道对 kubernetes 集群进行日志记录/监控的最佳方法是什么? 最佳答案 如果您正在 Azure 上寻找监视工具,您可能需要使用
我一直在尝试使用 erlang:monitor/2 来监视 gen_server。不幸的是,每次我尝试这个时,Erlang shell 都会进入无限循环。 这是我为测试这一点而编写的测试程序。 -mo
Azure 容器服务是否与 Azure Monitor 集成?想知道对 kubernetes 集群进行日志记录/监控的最佳方法是什么? 最佳答案 如果您正在 Azure 上寻找监视工具,您可能需要使用
我想使用 编写一个 shell 脚本来监控集群中的消费者滞后 bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect
在 .NET 中,假设 thread A 锁定了一个对象。同时,线程B和线程C被阻塞,等待线程A解锁对象。 现在,线程 A 解锁了对象。接下来将选择哪个线程(B 或 C)?它是如何确定的? 最佳答案
我搜索过这个主题,但发现很少有有用的细节。有了这些细节,我尝试编写一些代码如下。 注意:在将此帖子标记为重复之前,请将此帖子中共享的详细信息与其他帖子进行比较,而不仅仅是按主题。 - (NSArray
目录 1、指标监控 2、常用的监控端点 3、定制EndPoint 4、spring boot admin(可以使用)
我们使用 Prometheus 和 Grafana 来监控我们的 Kafka 集群。 在我们的应用程序中,我们使用 Kafka 流,Kafka 流有可能因异常而停止。我们正在记录事件 setUnCau
我正在建立一个复杂的网络仿真,并试图捕捉一些重要的性能测量。 我在服务器上运行了 mininet,并且我将视频从一个 mininet 主机流式传输到另一个(使用 -nodisp 选项,因为我没有 GU
Jenkins 的 openstack-plugin 使用 openstack4j 与 openstack 云对话。我正在寻找一种方法,我们可以从客户端的角度监控 openstack4j 所做的 ht
我正在处理一项需要监控 Thunderbolt 端口连接变化的要求。 (当连接或断开 Thunderbolt 电缆时)。 我尝试使用 IOServiceMatching(kIOUSBInterface
我是一名优秀的程序员,十分优秀!