「码动四季·开源同行」go实战案例:如何使用 Prometheus 和 Grafana 监控预警服务集群?
监控和预警平台是互联网公司较为重要的后端架构组成之一是整个运维乃至整个产品生命周期中最重要的一环它能够事前及时预警发现故障事后提供详实的数据用于追查定位问题。Prometheus和Grafana 相结合是开源服务监控和预警平台的主流方案之一。监控和预警平台的重要性在《SREGoogle运维解密》一书中就有体现开发人员可以通过监控和预警平台了解服务内部的实际运行状态通过对指标的观察可以预判所出现问题的可能原因并且能够在系统发生故障时快速通知相关的人员。建立完善的监控体系可以达到以下四个目的数据可视化。开发人员可以通过可视化仪表盘直观地了解系统的运行状态、资源使用情况和内部性能指标等信息。跟踪和分析程序的长期指标趋势。监控系统通过对监控样本数据的长期收集和统计来进行长期趋势分析以及预判操作。例如开发人员可以通过对磁盘空间占用增长率长期数据的分析提前预测需要在哪个时间点对磁盘进行清理操作。故障和异常告警。当系统将要或者已经出现故障或异常状态时监控系统能迅速感知并通知开发人员从而能够让开发人员对问题进行快速处理避免出现对业务的严重影响。故障和异常分析与定位。当故障或者异常发生后开发人员可以通过当时的监控数据对其进行调查和处理最终找到故障和异常产生的根源问题。今天我们就以一个简单的 Go服务为例从O 部署和搭建基于 Prometheus 和 Grafana的监控和预警平台通过钉钉机器人发送报警信息。如上图所示Prometheus 从不同类型的 Exporter上收集到业务服务或者中间件的数据然后 Grafana从 Prometheus 中获取数据并进行可视化展示还会根据报警规则将报警信息通过邮件、钉钉或者短信发送给开发人员。部署和配置PrometheusPrometheus 是一套开源的基于时间序列数据库的数据监控报警平台。2012 年Prometheus 由SoundCloud 公司着手开发后续又被多家公司和组织接受和采用最终将其独立为开源项目并成立独立公司来运作。开源之后Prometheus 项目及其社区一直非常活跃并获得众多开发人员的支持和参与。Prometheus 最终于 2016 年加入了云计算基金会成为继 Kubernetes 之后的第二个云计算基金会托管的开源项目。总之Prometheus是一款十分成功的开源服务监控预警系统它具有以下优点:多维数据模型时序列数据由 metric 名和一组 key/value 组成方便存储不同格式和模型的数据;可以使用自建的PromQL在多维度上灵活地进行数据查询方便数据检索和查询;不依赖分布式存储单主节点工作方便自身部署和运维;可以采用 Push 和 PushGateWay 结合的方式进行数据收集方便特殊网络状况下的数据收集;可以通过服务发现或者静态配置来获取要进行数据采集的目标服务或机器方便动态配置数据采集的目标支持多种可视化图表及表盘方便数据可视化。此外Prometheus 采集数据时使用拉模型Pul通过HTTP 协议调用Exporter 的接口来采集数据指标只要服务能够提供 HTTP 接口就可以接入 Prometheus 监控系统相较于私有协议或二进制协议来说接入成本低且开发简易这无疑简化了应用系统纳入该系统的工作量并降低了难度。首先我们使用 Docker 系统来部署 Prometheus:sudo docker run -d -p 9090: 9090 \ -v /prom_etc/prometheus.yml:/etc/prometheus/prometheus.yml \ -v /prom_etc/alert.rules:/etc/prometheus/alert.rules \ --name prometheus prom/prometheus \ --config.file/etc/prometheus/prometheus.yml \ --web.enable-lifecycle启动时加上-web.enable-lifecycle会启用远程热加载配置文件功能调用指令是curl-XPOSThttp://localhost:9090/-/reload。/prom_etc/prometheus.yml文件是主要的配置文件其具体配置和解释如下所示:global: scrape_interval: 15s#抓取数据的间隔默认为1分钟 evaluation_interval 15s #评估数据的间隔 external_labels: monitor: codelab-monitor数据抓取相关配置scrape_configs: # prometheus自身数据的抓取配置 job_name:prometheus static_configs: - targets: [localhost:9090]Go程序数据的抓取配置job_name: go scrape_interval:10s # 抓取间隔 metrics_path:/metrics # 抓取数据的URL路径 static_configs: - targets:[192.168.0.104:9100] #抓取数据的iP地址 labels: instance: go1scrape_configs 中配置的就是可以抓取数据的任务比如对 Prometheus自身数据的抓取、对 Go 程序数据的抓取、对 MySQL 数据的抓取和对 Redis 性能数据的抓取等等。Prometheus 特意显示了诸多exporter 来对这些程序或者中间件的数据抓取例如MySQL server exporter、Memcachedexporter 和 jMX exporter 等。我们可以在 Prometheus 的 Targets 页面查看这些抓取任务的状态具体如下图所示:由上图可以看到Prometheus自身的数据抓取已经成功但是对Go程序的抓取一直处于失败状态所以接下来我们需要部署 Go服务程序并提供相应的数据抓取网络接口。部署Go服务的Exporter我们可以直接使用 Prometheus 提供的 Go语言Client 来实现 Go程序数据的 Exporter只要引入prometheus/client_golang包并建立网络服务即可具体代码如下所示:import ( net/http github.com/prometheus/client_golang/prometheus/promhttp ) func main() { http.Handle(/metrics, promhttp.Handler()) http.ListenAndServe(:9100 nil) //监听 9100端口提供数据抓取服务 }该程序运行起来后再去 Prometheus 的 Targets 界面查看就会发现Prometheus已经能够获取到Go服务进程相关的数据了。虽然 Prometheus 自带数据的可视化界面但是图表格式较为基础且只能临时查看总之是不够好用所以业界一般使用Grafana作为监控数据的展示平台。部署和配置GrafanaGrafana是一款专门的数据可视化工具。它有着非常漂亮的布局和图表展示以及功能齐全的度量仪表盘和图形编辑器。除此之外Grafana 还能够根据查询条件设置聚合规则在对应的图表上进行展示并且支持多个图表共同组建成一个看板。Grafana的主要优点有图表展示方式灵活。Grafana 能够支持多种可视化指标和看板拥有丰富的仪表盘插件比如热图、折线图和图表等多种展示方式。支持多种数据源。Grafana 支持多种数据源可以将 Graphite、InfluxDB、OpenTSDB、Prometheus、Elasticsearch、CloudWatch 和 KairosDB 等系统作为数据源。强大的报警规则配置和通知功能。Grafana可以配置相应指标的警报规则并每隔固定时间计算判断是否触发规则在数据触发规则时通过钉钉、邮件、短信等方式发送报警信息。支持多数据源混合展示。在同一图表或者看板中可以使用不同数据源的数据每个查询都可以特殊指定数据源甚至可以自定义数据源。下面我们就来部署和配置 Grafana平台并以 Prometheus 为数据源建立对 Go 程序的数据展示面板。首先还是使用 Docker 部署 Grafana 镜像:docker run -d -p 3001:3000 --namegrafana544 grafana/grafana然后登录网站htp://127.0.0.1:3001/用户名和密码默认都是 admin登录后要修改登录密码。接着我们配置Grafana的数据源从列表中选择 Prometheus然后URL一栏填写其服务器地址Access一栏选择 Server 项再点击 Save Test 按钮来检查并保存这样我们就将上文配置的Prometheus 设置为Grafana的数据源了。Grafana数据源配置页面最后我们来建立 Go程序数据的可视化看板从界面左侧的加号点击可以从0开始新建可视化看板也可以导入其他人开源的可视化看板。新建看板时只要在Metrics中输入自己想要监控的数据名称即可比如我们想要监控 Go程序中协程的数量则输入go_goroutines然后上方图标就会显示出对应的数据一个是 Prometheus 平台自身的协程数据另外一个则是 Go程序的协程数据。如果只想看Go程序的则可以输入go_goroutinesjobgo}即可限定只显示 Go 程序的数据。Grafana看板配置页面新建看板虽然入门简单但是想要建立起完备真实可用的看板也是要花费一定时间的所以我们往往都是直接导入其他人开源的看板配置。那怎么导入呢首先我们在Grafana dashboards | Grafana Labs上搜索Go 相关的看板配置然后检查这个看板配置是否和我们所收集数据的Exporter相互吻合确定之后复制该看板详情页面的网络URL。Grafana网站页面将 URL贴到Grafana 的导入页面上点击加载就会加入一些看板名称、数据来源等配置点击保存我们就直接获得了Go程序的监控数据可视化看板界面。Grafana 看板导入界面从可视化看板中我们可以清晰地看到Go 程序相关的性能指标曲线图比如 process memory、gomemstats、Goroutines 和 GC duration 等。Grafana看板详情界面基于这些性能指标曲线图我们就可以清楚地了解Go程序在过去的某一时刻某些指标是否异常从而给线上Go程序异常分析工作提供巨大的帮助。除了协助异常诊断Grafana还可以根据性能指标进行报警比如当 process memory 超过一定数值时通过钉钉或者邮件向开发者发出报警信息有助于开发者提前感知线上程序的异常状态从而尽快处理以减少线上程序异常情况发生的频率。配置报警规则和通道接下来我们就来基于 Grafana 配置对于 Go 程序的性能数据异常的报警渠道。首先我们编辑想要报警指标的看板切换到Alert一栏在Conditions下面我们可以进行均值相关的配置如下图所示我们就做了这样的配置如果 Go程序线程数量在一分钟内的均值超过8则报警对应的上方图标就有一条红线表示警戒线。Grafana报警规则配置界面接着我们需要配置报警渠道可以选择钉钉或者邮件渠道。我们在需要发送报警消息的群中首先添加一个自定义机器人安全设置就勾选自定义关键词选项关键词就选择报警”二字。钉钉机器人配置界面添加后我们可以获得该机器人的 Webhook 地址然后进入Grafana的报警渠道配置页面新建DingDing 类型的报警渠道将Webhook 地址填入 Url一栏点击 Test 没问题后再点击 Save 进行保存。Grafana 报警通道配置界面然后在配置报警规则时报警渠道选择钉钉报警渠道”文本消息中必须包含报警二字否则不能通过钉钉机器人的安全配置校验从而导致无法发送报警信息具体配置如下图所示:Grafana报警规则配置页面综上Grafana每隔1分钟对Go服务的协程数量进行判断如果其数值持续超过8 到达 5分钟则通过钉钉发送报警消息。小结本文主要讲解了如何使用 Prometheus 和 Grafana 建立 Go 程序性能数据监控和报警平台。根据系统的需要对业务服务、中间件或者数据库的数据基表进行收集和展示方便开发人员查看和了解整体系统的动态和数据指标协助排查线上异常问题和提前发现异常状态。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2498429.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!