监控目标

监控指标

  1. 系统指标:CPU负载和CPU使用率、内存使用率
  2. 网络指标:网络IOPS情况
  3. 磁盘指标:磁盘空间使用率、磁盘IOPS使用情况
  4. 容器/应用指标:虚拟容器指标(比如Docker)、线程数量、JVM、链路追踪
  5. 硬件指标:温度、功率等

监控告警

  1. 应用日志异常告警
  2. 系统指标异常告警
  3. IOPS异常告警

其他

故障分析
**

kubesphere

KubeSphere是一个分布式操作系统,Kubernetes为内核管理本地云应用程序,它提供了即插即用的体系结构,可无缝集成第三方应用程序以增强其生态系统。

系统和应用资源监控 - 图1

系统和应用资源监控 - 图2

优点

  1. 功能十分强大,可集成得三方应用多
  2. 平台兼容性好
  3. DevOps支持:提供了基于流行的CI / CD工具(例如Jenkins)的可插拔DevOps组件
  4. 分布式跟踪:能够跟踪服务之间的交互方式
  5. 多租户管理:区分角色和操作权限
  6. 交通管理:支持应用多版本部署(金丝雀和蓝绿部署)、断路器
  7. 多维监控
    1. 定制的监控仪表板,例如Elasticsearch、MySQL、Redis
    2. 对于基础架构监视,系统提供全面的指标,例如CPU利用率,内存利用率,CPU负载平均值,磁盘使用率,inode利用率,磁盘吞吐量,IOPS,网络出站/入站速率。
  8. 警报,事件,审核和通知(支持邮件、wechat)
  9. 日志查询与收集
  10. 可视化应用部署
  11. 社区十分活跃,最新代码提交于1天内,版本迭代快今年2个版本

缺点

  1. 学习代价较大
  2. 生态圈比较庞大,服务较重,平台服务维护难度较高
  3. 基于Kubernetes,需要Kubernetes
  4. 依托阿里云的Kubernetes服务,无法本地化部署、无法在此基础搭建kubesphere

Spring Cloud Admin

Cloud-Admin是国内首个基于Spring Cloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。

优点

  1. 轻量,部署简单
  2. 支持邮件告警
  3. 监控颗粒度细
    1. JVM配置信息、堆栈信息、可下载heapdump
    2. 线程会话和线程管理(spring-session)
    3. 实时查看接口的运行状态和调用频率等
    4. 监控各个独立Service的运行状态
  4. 链路追踪
  5. 服务健康检查信息、CPU、内存、操作系统信息

缺点

  1. 无法监控Dokcer容器资源情况
  2. 代码侵入性,每个被监控的项目都需要代码配置,但配置对应用整体影响较小,不会影响到业务逻辑和通信路由;
  3. 该方案能否兼容非Spring Boot项目待调研,从文档手册看暂时认定无法兼容。所以该监控暂时排除Java非spring boot 项目以及.net项目;
  4. 看了下社区活跃度都不高,gitee活跃于2年前,github上都是个人库
  5. 版本兼容问题,依赖包和spring-boot版本不一致兼容性较差

搭建步骤

  1. 添加依赖

    1. <dependency>
    2. <groupId>de.codecentric</groupId>
    3. <artifactId>spring-boot-admin-starter-server</artifactId>
    4. <version>2.1.0</version>
    5. </dependency>
  2. 在主类上添加注解@EnableAdminServer

  3. application.yml文件中添加配置,然后启动

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: springcloud-admin-client
    6. boot:
    7. admin:
    8. client:
    9. #springboot admin client连接 spring boot admin server 端点地址springboot admin client连接 spring boot admin server 端点地址
    10. url: http://localhost:8788
    11. instance:
    12. #默认使用的是主机名注册,改为使用ip注册
    13. prefer-ip: true
    14. management:
    15. endpoints:
    16. web:
    17. exposure:
    18. #开放所有页面节点 默认只开启了health、info两个节点
    19. include: '*'
    20. endpoint:
    21. health:
    22. #显示健康具体信息 默认不会显示详细信息
    23. show-details: always
    24. # 利用info端点,加入版本等信息
    25. info:
    26. versin: @project.version@
    27. name: @project.artifactId@
    28. group: @project.groupId@
    29. description: @project.description@
    30. #还可以自定义信息
    31. author: Coding Farmer
    32. blog: http://www.coding-farmer.cn
  4. 添加认证

    4.1 添加依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    4. </dependency>

    4.2 在启动类上添加Eureka的注解@EnableEurekaClient
    4.3 application.yml配置,然后启动 ```yaml server: port: 8788 spring: application: name: springboot-admin-server security: user: name: coding-farmer password: 123456 eureka: client: service-url: defaultZone: http://localhost:8700/eureka

    客户端每隔30秒从Eureka服务上更新一次服务信息

    registry-fetch-interval-seconds: 30

    需要将我的服务注册到eureka上

    register-with-eureka: true

    需要检索服务

    fetch-registry: true

    心跳检测检测与续约时间

    instance:

    告诉服务端,如果我10s之内没有给你发心跳,就代表我故障了,将我剔除掉,默认90s

    Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)

    lease-expiration-duration-in-seconds: 10

    每隔2s向服务端发送一次心跳,证明自已依然活着,默认30s

    Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)

    lease-renewal-interval-in-seconds: 2

    启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的

    prefer-ip-address: true

    实例名称 最后呈现地址:ip:2002

    instance-id: ${spring.cloud.client.ip-address}:${server.port} health-check-url-path: /actuator/health

    Eureka 中的 metadataMap 是专门用来存放一些自定义的数据,

    当注册中心或者其他服务需要此服务的某些配置时可以在 metadataMap 里取。

    实际上,每个 instance 都有各自的 metadataMap,map 中存放着需要用到的属性。

    例如,上面配置中的 eureka.instance.metadata-map.username,当这个服务成功注册到 Eureka 上,

    Spring Boot Admin 就会取拿到这个 instance,进而拿到 metadataMap 里的属性,

    然后放入请求头,向此服务发送请求,访问此服务的 Actuator 开放的端点。

    说白了,这个为了连接到自己,把密码告诉eureka,spring boot admin server 拿着密码去连接客户端应用,监控信息

    metadata-map: user.name: ${spring.security.user.name} user.password: ${spring.security.user.password}

使用注册中心后,他admin也可以监控自身服务状况

management: endpoints: web: exposure:

  1. #开放所有页面节点 默认只开启了health、info两个节点
  2. include: '*'

endpoint: health:

  1. #显示健康具体信息 默认不会显示详细信息
  2. show-details: always

利用info端点,加入版本等信息

info: versin: @project.version@ name: @project.artifactId@ group: @project.groupId@ description: @project.description@

还可以自定义信息

author: Coding Farmer blog: http://www.coding-farmer.cn ``` 系统和应用资源监控 - 图3

kubesphere 和 Spring Cloud Admin对比

Spring Cloud Admin针对得监控主要是应用服务和宿主机的状态监控;kubesphere支持各个组件状态监控。

kubesphere Spring Cloud Admin
集成难度
功能完善度 完善 不完善
契合度 契合 契合
入侵性 中等
社区活跃度 活跃 活跃?
完善度 完善 只支持应用监控功能
资料 依赖官方文档(官方文档较为完善) 资料较多
宿主机监控 支持 不支持
应用监控 支持 支持
集群监控 支持 不支持
部署难易程度
堆栈监控 不支持 支持
线程监控 不支持 支持
应用集群资源监控 支持 不支持
调整服务日志级别 不支持? 支持
集群易扩展 支持 不支持
故障转移 支持 不支持
耗时人天 15 5

结论

考虑到人天和后期维护成本,采用spring cloud admin方案。