Prometheus简介Prometheus是一个开源的监控告警系统,最初由SoundCloud开发。2016年,Prometheus被谷歌发起的Linux基金会纳入云原生计算基金会(CloudNativeComputingFoundation),成为仅次于Kubernetes的第二大开源项目。从那时起,它就成为一个独立的开源项目,独立于任何公司进行维护。Prometheus拥有非常活跃的开发者和用户社区,目前在GitHub上的Star数超过30,000。Prometheus特性提供了多维度的数据模型,并为通过索引名和键值对标识的时间序列数据提供了灵活的PromQL查询方式。它还提供了一个HTTP查询接口,可以方便地与Grafana等组件结合展示数据。不依赖外部存储,支持单节点本地存储。通过Prometheus自带的时序数据库,可以完成每秒百万级的数据存储。如果需要存储大量的历史数据,也可以对接第三方时序数据库。通过HTTPpull进行时序采集,提供开放的指标数据标准。支持向中间网关推送时序数据,可以更灵活的应用于各种监控场景。支持通过动态服务发现和静态文件配置获取监控对象,目前支持Kubernetes、Etcd、Consul等多种服务发现机制。支持多种模式的图形显示和仪表板。大多数Prometheus组件都是用Go编写的,这使得它们易于构建和部署为二进制文件。Prometheus架构Prometheus生态系统由多个组件组成,其中许多组件是可选的:PrometheusServer:用于收集、存储和查询时间序列数据。可以通过静态配置文件来管理监控目标,也可以使用动态服务发现来动态管理监控目标,并从这些监控目标中获取数据。它将采集到的数据按时序存储在本地磁盘或外部时序数据库中,并可以通过PromQL语言对数据进行查询和分析。ClientLibrary:为被监控的应用程序生成相应的指标(Metric)数据,暴露给PrometheusServer。PrometheusServer在拉取时,直接返回实时状态指标数据。PushGateway:主要用于短期作业。由于此类作业存在的时间很短,因此它们可能会在PrometheusServer拉取数据之前消失。因此,Jobs可以直接将自己的指标数据推送到PushGateway,然后由PrometheusServer从PushGateway中拉取。Exporters:用于将现有第三方服务的指标数据通过HTTP服务暴露给PrometheusServer,如HAProxy、StatsD、Graphite等。PrometheusServer可以通过访问Exporter提供的Endpoint获取需要采集的监控数据。Alertmanager:收到来自PrometheusServer的告警后,会去除重复数据,分组,路由到接收方法,发送告警。Alertmanager的告警方式非常灵活,支持通过email、slack、钉钉等多种渠道发送告警。其他一些组件。下图展示了Prometheus的架构,以及各个组件是如何交互协作的:大致的工作流程是:PrometheusServer直接从HTTP接口或者PushGateway拉取指标(Metric)数据。PrometheusServer在本地存储所有收集到的指标(Metric)数据,并对这些数据运行规则,从现有数据中聚合和记录新的时间序列,或者生成警报。Alertmanager根据配置文件对接收到的告警进行处理并发出告警。在Grafana或其他API客户端中,可视化收集的数据。Prometheus数据模型Prometheus会将所有采集到的监控数据按时间序列保存在内存数据库中,并每隔一定时间保存到硬盘中。每条数据由以下三部分组成:Metric:由metric的名称和描述当前数据特征的标签组成。时间戳:精确到毫秒的时间戳。数据值(Value):一个float64浮点型数据,表示当前数据的值。其中,指标(Metric)通过以下格式标识:<指标名称>{<标签名称>=<标签值>,...}指标名称(MetricName)可以反映监控数据的含义。指标名称只能由ASCII字符、数字、下划线和冒号组成,并且必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。标签(Label)反映了当前数据的特征维度,普罗米修斯通过它可以对数据进行过滤、聚合等操作。标签名称只能由ASCII字符、数字和下划线组成,并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*。例如:prometheus_http_requests_total{code="200",handler="/metrics"}指标类型Prometheus定义了4种不同的指标类型(MetricType):Counter(计数器)Gauge(仪表盘)Histogram(直方图)Summary(汇总)Counter(计数器))Counter类型与计数器相同,只增不减(除非系统复位)。一般建议在定义Counter类型指标名称时使用_total作为后缀。例如PrometheusServer中的prometheus_http_requests_total表示Prometheus处理的HTTP请求总数:#HELPprometheus_http_requests_totalCounterofHTTPrequests.#TYPEprometheus_http_requests_totalcounterprometheus_http_requests_total{code="200",handler="/api/v1/label/:name/值”}3prometheus_http_requests_total{code="200",handler="/api/v1/query"}5prometheus_http_requests_total{code="200",handler="/api/v1/query_range"}15prometheus_http_requests_total{code="200",handler="/图"}3prometheus_http_requests_total{code="200",handler="/metrics"}23prometheus_http_requests_total{code="200",handler="/static/*filepath"}18prometheus_http_requests_total{code="302",handler="/"}1Gauge(仪表盘)Gauge类型关注反应系统的某个瞬时值,此类指标的数据可以增减。例如PrometheusServer中的go_threads表示Prometheus中当前Go线程的数量:#HELPgo_threadsNumberofOSthreadscreated.#TYPEgo_threadsgaugego_threads13Histogram(直方图)直方图类型由
