草庐IT

Monitor 监控架构

cpuCode 2023-12-02 原文

Monitor 监控架构

采集器: 负责采集监控数据的,采集到数据之后传输给服务端,通常是直接写入时序库

对时序库的数据 :

  • 分析部分: 告警规则判断, 并进行通知
  • 可视化: 通过各种图表来合理地渲染各类监控数据

采集器

采集器:负责采集监控数据

采集器的部署方式 :

  • 跟随监控对象部署,如: 所有的机器上都部署一个采集器,采集机器的 CPU、内存、硬盘、IO、网络相关的指标
  • 远程探针式,如: 选取一个中心机器做探针,同时探测很多机器的 PING 连通性

采集器的数据,推给服务端的两种方法 :

  • 直接推给时序库
  • 先推给 Kafka,再由 Kafka 写到时序库。更复杂情况,可能会用 Kafka + Flink + 时序库
采集器优点缺点推荐场景
Telegraf指标的全家桶不适合 Prometheus 生态配合 InfluxDB 使用
Exporters生态庞大Exporter 水平参差不齐Kubermetes
Grafana-Agent指标, 日志, 链路统一采集器集成不全Kubermetes
Categraf指标, 日志, 链路统一采集器集成不全物理机, 虚拟机, 容器都适用

Telegraf

Telegraf 是 InfluxData 公司的产品

  • All-In-One 采集器,支持各种采集插件
  • 与 Prometheus、Graphite、Datadog、OpenTSDB、InfluxDB 配合存储

Telegraf 采集数据多为字符串类型,这类数据推给 Prometheus,VictoriaMetrics、M3DB、Thanos (数值型时序数据) 要转为数值型存储

对于标签变化的指标 (标签非稳态结构) ,与 Prometheus 生态的时序库对接时 ,要把这类标签丢弃掉

  • 设置 Telegraf : metric_version = 2
  • drop_tag : 删除不要的标签

Exporters

Exporter : 专门对接 Prometheus 生态的组件

  • Exporter 组件众多,如: mysqld_exporter,redis_exporter,snmp_exporter,jmx_exporter

由于 Prometheus 影响较大,很多中间件都内置暴露 /metrics 监控数据的接口

  • 如: kube-apiserver、kube-proxy、kube-scheduler ,etcd,ZooKeeper、 RabbitMQ、HAProxy

Grafana-Agent

Grafana-Agent 是 Grafana 公司推出的 All-In-One 采集器

  • 能采集指标数据,也能采集日志数据 , 链路数据

Grafana-Agent 有个框架,方便导入各类 Exporter,如: Node-Exporter、Kafka-Exporter、Elasticsearch-Exporter、Mysqld-Exporter

  • 用 PUSH 方式推送监控数据,完全兼容 Node-Exporter 指标
  • 支持用 PULL 方式去抓取其他 Exporter 的数据,再通过 Remote Write 将采集到的数据转发给服务端
  • 对日志采集,集成了 Loki 生态的日志采集器 Promtail
  • 对链路数据,集成了 OpenTelemetry Collector

Categraf

Categraf 是快猫团队开源的一款监控采集器

  • 支持 metrics、logs、traces 的采集
  • 只采集数值型时序数据 (标签是稳态结构) ,通过 Remote Write 方式推送数据给后端存储(Prometheus、VictoriaMetrics、M3DB、Thanos)
  • 支持读取 prometheus.yml 的 scrape 配置,对接各类服务发现机制

时序库

时序库优点缺点
OpenTSDB指标设计较灵活基于 Hbase, Cassandra 架构较复杂
influxDB与 Grafana , Telegraf 整合良好只开源单机版本
TDEngine集群爸爸开源 , 针对设备场景优化设计不支持 Prometheus Querier 接口
M3DB抗住大容量 , 扩展方便对 CPU,内存要求较高 , 架构复杂
VictoriaMetrics集群版 , 架构简单 , 支持 Prometheus Querier 接口
TimescaleDB基于 PostgreSQL 开发国内应用较少

OpenTSDB

OpenTSDB 出现较早,2010 年左右就有了

  • OpenTSDB 是基于 HBase 封装或 基于 Cassandra 封装

架构图 :

InfluxDB

InfluxDB 来自 InfluxData

  • 针对时序存储场景专门设计了存储引擎、数据结构、存取接口,国内使用范围较广泛
  • InfluxDB 配合 Grafana、Telegraf 使用,生态非常完备
  • InfluxDB 开源版本是单机

TDEngine

TDEngine 是国产版 InfluxDB,针对物联网设备的场景做了优化,性能很好,能配合 Grafana、Telegraf 使用

  • 集群版是开源
  • 内置支持了流式计算
  • 支持 Prometheus 的 remote_read 和 remote_write 接口

M3DB

M3DB 是 Uber 的时序数据库

  • 声称能抗住 66 亿监控指标,
  • M3DB 是全开源,但架构原理较复杂

VictoriaMetrics

VM (VictoriaMetrics) : 架构非常简单清晰,采用 merge read 方式,避免数据迁移

  • 用一批云上虚拟机,挂上云硬盘,部署 VM 集群,用单副本,是非常轻量可靠的集群方式
  • 实现了 Prometheus 的 Query 类接口,如: /api/v1/query/api/v1/query_range/api/v1/label/<label-key>/values
  • 能当 Prometheus 的 Backend,或 Prometheus 的替代品

VM 架构图 :

TimescaleDB

TimescaleDB : timescale.inc 开发的一款时序数据库,基于 PostgreSQL 设计

  • 当数据量到百亿或千亿行时,数据库性能会下降

告警引擎

告警引擎 : 处理告警规则,生成告警事件

告警引擎的两种架构 :

  • 数据触发式 : 服务端接收到监控数据后,还会发给告警引擎,告警引擎判断是否告警
  • 周期轮询式 : 架构简单,指标关联计算较容易实现。产品如: Prometheus、Nightingale、Grafana

生成事件后,给告警发送的模块

  • 该模块负责事件聚合、收敛,并通知不同的接收者
  • 告警发送的产品: PagerDuty,能接收各类事件源的事件,只用配置 OnCall 响应

数据展示

监控数据的可视化用 Grafana

  • 采用插件式架构,支持不同类型的数据源,图表非常丰富
  • 很多公司的商业化产品中,甚至直接内嵌了 Grafana
  • 新版本已修改了开源协议 (AGPLv3) ,基于 Grafana 二次开发,要公开代码

监控数据可视化的两类需求 :

  • 即时查询 : 临时起意,要追查监控数据
  • 监控大盘(Dashboard) : 日常巡检和问题排查,放重点关注的指标

有关Monitor 监控架构的更多相关文章

  1. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  2. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  3. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  4. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  5. ruby-on-rails - 监控多个 Rails 应用程序 - 2

    是否可以在我的服务器上运行任何工具来监控多个Rails应用程序?我需要监控每个应用程序收到的请求数、每个应用程序使用了多少内存、使用了多少CPU以及其他类似的统计信息。我需要查看每个单独的Rails应用程序的统计信息。 最佳答案 我建议你试试NewRelicRPM.免费版:RPMLiteisthemostwidelyusedsolutionforbasicwebapplicationmonitoring.RPMLiteprovidesapplicationmonitoringforunlimitedJava,RubyorJRubya

  6. ruby - 写密集型特征的架构 - 2

    我在当前项目中使用由Oracle数据库和memcached支持的RubyonRails。有一个非常常用的功能,它依赖于单个数据库View作为数据源,并且该数据源内部有其他数据库View和表。这是一个虚拟数据库View,能够从一个地方访问所有内容,而不是物化数据库View。大多数情况下,如果用户正在使用他们希望更新的功能,那么让数据保持最新很重要。从这个View获取数据时,我将安全表内部连接到View(安全表不是View本身的一部分),其中包含一些我们用来在更细粒度级别上控制数据访问的字段。例如,安全表有user_id,prop_1,prop_2列,其中prop_1,prop_2是数据库

  7. ruby-on-rails - 监控 RTMP 流,如果可用则记录 - 2

    我正在寻找一种方法来监视流上的事件,以便我可以确定是否有任何内容通过流。如果有,我将开始使用rtmpdump进行录制。我想象这是通过运行一个每60秒检查一次流的cron任务来实现的。如果它确定流正在通过,则调用rtmpdump开始记录它。如果没有,则什么都不做,并在60秒后再次检查。由于rtmpdump只是在没有流数据时出现错误,因此尝试使用它来监视流似乎不是一个好主意,但也许我错了。如果我在逐个案例的基础上手动执行此操作会很容易,但我正在尝试自动执行自动录制流的任务(如果它们可用)。有没有人遇到过这样做的方法?也许我可以在命令行(linux)中使用其他一些工具?如果有帮助,我正在使用

  8. ruby - 如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间 - 2

    每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!

  9. ruby-on-rails - Rails 中的用户监控 - 2

    我们有一个带有广泛管理部分的应用程序。我们对功能有点满意(就像您一样),并且正在寻找一些快速简便的方法来监控“谁使用什么”。理想情况下,一个简单的gem将允许我们在每个用户的基础上跟踪Controller/操作,以构建使用的功能和未使用的功能的图片。任何你会推荐的..谢谢主场 最佳答案 我不知道有什么流行的gem或插件可以解决这个问题;过去,我在ApplicationController中将这种审计实现为before_filter:从内存中:classApplicationControllercurrent_user,:contro

  10. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

随机推荐