聊一聊对外API接口的存活检查可以怎么做

背景

公司内部的API接口一般会分为两大类,一类是直接暴露在公网可以访问的,一类是只能在局域网内访问的。

暴露在公网的一般就是业务网关以及一些和第三方公司有着某些合作,从而进行数据交互的接口。

检查API接口是否存活,第一反应应该就是健康检查了。

在局域网环境内搭配 nginx 或注册中心之类的健康检查机制,一定程度的保证了只有健康的实例才会进行服务。

把这一块放到公网环境,判断一个API接口是否存活,情况就复杂很多了。

  1. 域名解析

  2. SSL证书

  3. 响应情况

  4. ...

举个老黄待过的两个公司的实际例子,这两个公司遇到的都是SSL证书过期,没有及时更换的问题,直接就是最高级故障。

在这种情况下,其实接口在局域网内是能正常访问,可以理解成它是存活的,但是放到公网环境,用户就是不能访问到,这个时候对用户来说就是故障的。

所以涉及到对外服务API存活的检查,光一个简单的健康检查还是不够的,还需要站在用户的层面去考虑。

或许大家会说,这种事情不是运维负责的吗?怎么还要我们开发去操心?

这个很大程度是看团队的,有的团队都不一定有运维这个角色,都是开发搞定的。

另外,多丰富一点自己的技术栈和技术广度并不是什么坏事哈。

下面就简单介绍一下老黄的处理方案吧。

处理方案

老黄这边选择的处理方案是 【Prometheus + Blackbox + Grafana + Alertmanager + PrometheusAlert】

Prometheus,Grafana 和 Alertmanager 这三个就不过多的介绍了。

下面主要介绍一下 Blackbox 和 PrometheusAlert:

Blackbox 是 Prometheus 官方提供的一种黑盒监测方案,也是本文一个最关键的点。

下面是一些常见的应用场景

  • HTTP 测试,定义 Request Header 信息,判断 Http status / Http Respones Header / Http Body 内容

  • TCP 测试, 业务组件端口状态监听,应用层协议定义与监听

  • ICMP 测试,主机探活机制

  • POST 测试,接口联通性

  • SSL 证书过期时间

PrometheusAlert 是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据可视化系统Grafana、SonarQube等支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,容联云电话等。

换句话就是说,把告警消息通过 PrometheusAlert 发送个体企业微信机器人或钉钉机器人。

整个链路大概是这样的:

  1. BlackBox 负责探测

  2. Prometheus 主动 pull 探测的结果并进行存储

  3. Prometheus 根据告警规则进行评估,将告警扔到 AlertManager

  4. AlertManager 收到 Prometheus 的消息后,通知给 PrometheusAlert

  5. PrometheusAlert 收到 AlertManager 的消息后,通知到对应的端

实战

下面先用 docker 启动一个 blackbox-exporter 实例

docker run -d \-p 13002:9115 \--name=blackbox \--restart=always  \prom/blackbox-exporter:v0.19.0

运行后看到的大概就是这个样子。


这一块的配置基本不用变更,用默认的即可,主要的配置还是在 Prometheus 那边。

可以点击上图的 Configuration 去看默认的配置。


下面就去调整 Prometheus 的配置。

这里只以 http 检测为例来说明。

global:scrape_interval:     30sevaluation_interval: 30salerting:alertmanagers:- static_configs:- targets:- xxx.xxx.xxx.xxx:13005  rule_files:- "/prometheus/blackbox_rules/*.yml"scrape_configs:- job_name: 'outer'metrics_path: "/probe"params:module: [http_2xx]  # 模块对应 blackbox.yml file_sd_configs:- files: ['/prometheus/blackbox_configs/outer/*.yml']refresh_interval: 10srelabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: xxx.xxx.xxx.xxx:13002  # blackbox安装在哪台机器

其中 scrape_configs 里面是最为重要的,一个是 params ,一个是 relabel_configs, 一个是 file_sd_configs。

剩下的就是一些常规配置了。

然后是 file_sd_configs 里面一堆可以变化的 yml 文件,也就是那些对外的域名要进行 http 检测的。

- targets: [ 'https://xxx.xxxxx.com' ]labels:domain: xxxxxxxxenv: xx云-公网service: 网关  ip: xxxxxxxx

配置里面的 labels 是一些辅助信息,可以按需添加,可以在 grafana 里面进行展示的。

到这里,关于 blackbox 的配置基本就差不多了。

接下来是在 grafana 里面展示,看一下结果。


PS: 这里用的是 【9965】 这个模板。

面板虽然好看,但是我们不能每时每刻都在盯着这个面板的,所以还是离不开告警这一监控领域的大头。

下面是告警规则的配置

groups:
- name: 服务探测rules:- alert: BlackboxProbeFailedexpr: probe_success == 0for: 0mlabels:severity: criticalteam: nodeannotations:      summary: Blackbox probe failed (instance {{ $labels.instance }})description: "服务在线检查失败\n当前值= {{ $value }}\nIp = {{ $labels.ip }}\nDomain= {{ $labels.domain }}\nEnv= {{ $labels.env }}\n服务名= {{ $labels.service }}"- alert: BlackboxProbeHttpFailureexpr: probe_http_status_code <= 199 OR probe_http_status_code >= 400                            for: 0mlabels:severity: criticalteam: node                                                            annotations:                                                               summary: Blackbox probe HTTP failure (instance {{ $labels.instance }})description: "HTTP状态码不在200-399\n当前值= {{ $value }}\nIp = {{ $labels.ip }}\nDomain= {{ $labels.domain }}\nEnv= {{ $labels.env }}\n服务名= {{ $labels.service }}"- alert: BlackboxSslCertificateWillExpireSoonexpr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30for: 0mlabels:severity: warningannotations:summary: Blackbox SSL certificate will expire soon (instance {{ $labels.instance }})description: "SSL certificate expires in 30 days\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"    

上面这个主要是3个告警规则,看描述就知道它的作用的,也不用过多的说明了,这些告警表达式是参考 Awesome Prometheus alerts 调整的。

再下一步就到告警消息的配置了。

先用 docker 启动一个 prometheus-alert 的实例

docker run -d -p 13006:8080 \-v /data/prom-alert/conf:/app/conf \-v /data/prom-alert/db:/app/db \-v /data/prom-alert/logs:/app/logs \--name prom-alert \-e TZ=Asia/Shanghai \--restart=always  \feiyu563/prometheus-alert:v-4.4.3

这里默认带了很多模板


这里选择自己定义一个告警模板


{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢复信息]({{$v.generatorURL}})> <font color="info">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="info">告警级别</font>:{{$v.labels.severity}}
> <font color="info">开始时间</font>:{{GetCSTtime $v.startsAt}}
> <font color="info">结束时间</font>:{{GetCSTtime $v.endsAt}}
> <font color="info">实例地址</font>:{{$v.labels.instance}}
> <font color="info">主机名称</font>:{{$v.labels.hostname}}**{{$v.annotations.description}}**
{{else}}
#### [Prometheus告警信息]({{$v.generatorURL}})> <font color="#FF0000">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
> <font color="#FF0000">开始时间</font>:{{GetCSTtime $v.startsAt}}
> <font color="#FF0000">结束时间</font>:{{GetCSTtime $v.endsAt}}
> <font color="#FF0000">实例地址</font>:{{$v.labels.instance}}
> <font color="#FF0000">主机名称</font>:{{$v.labels.hostname}}**{{$v.annotations.description}}**
{{end}}
{{ end }}

这里的模板是做了一个颜色的区分,告警的用红色,恢复的用绿色,由于 Prometheus 和 AlertManager 用的都是 UTC 时间,所以这里用 GetCSTtime 转化成北京时间。

最后是回到 alertmanager 里面去配置

global:resolve_timeout: 5m
route:receiver: 'default-receiver'group_wait: 30sgroup_interval: 1mrepeat_interval: 5mgroup_by: [alertname]routes:- receiver: 'blackbox-webhook-outer'group_wait: 10scontinue: falsematch_re:job: outer
receivers:
- name: 'default-receiver'webhook_configs:- url: 'http://xxxxxx:13006/prometheusalert?type=wx&tpl=prometheus-wx&wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx' 
- name: 'blackbox-webhook-outer'webhook_configs:# 这里的url 是配置的 PrometheusAlert 自定义模板管理里面的路径- url: 'http://xxxxxx:13006/prometheusalert?type=wx&tpl=blackbox_alert&wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx'

最后来看一些实际告警和恢复的例子

其他

如果不想考虑自己搭建的话,不少云产商也有提供类似的功能,好比阿里云有一个叫站点监控的产品也可以帮我们搞定这个问题,不过只能免费一个月,超过还是需要购买的。

小结

API接口存活的检查其实也是一门不小的学问,考虑的内容还是不少的。经历过生产事故,所以对这一块会特别看重。

目前中小团队的监控体系应该是离不开事实标准的 Prometheus,所以在其基础上去拓展会有比较多成熟的可以借鉴的经验来落地。

相关阅读

  • https://github.com/prometheus/blackbox_exporter

  • https://grafana.com/grafana/dashboards/9965

  • https://awesome-prometheus-alerts.grep.to/rules

  • https://feiyu563.github.io

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种机械原理动态图,看完脑洞大开,绝对涨姿势!

全世界只有3.14 % 的人关注了爆炸吧知识1.钥匙开锁2.撬锁3.汽车换挡4.手枪上膛发射5.炮弹发射原理6.手雷爆炸7.洗衣机8.缝纫机9.心脏10. 近视眼手术&#xff1a;原理其实很简单&#xff0c;就是把角膜削成一个“隐形眼镜”。11.零钱分类12.吹号转载来源&#xff1a;物理好教师部…

CSharp设计模式读书笔记(10):装饰模式(学习难度:★★★☆☆,使用频率:★★★☆☆)...

装饰模式(Decorator Pattern)&#xff1a; 动态地给一个对象增加一些额外的职责&#xff0c;就增加对象功能来说&#xff0c;装饰模式比生成子类实现更为灵活。 模式角色与结构&#xff1a; 示例代码&#xff1a; using System; using System.Collections.Generic; using Syste…

ShardingCore 如何呈现“完美”分表

这篇文章是我针对efcore的分表的简单介绍,如果您有以下需求那么可以自己选择是否使用本框架,本框架将一直持续更新下去&#xff0c;并且免费开源为.net生态做贡献,如果您觉得不错那么请帮忙点个star谢谢&#xff0c;框架地址[sharding-core](https://github.com/xuejmnet/shard…

使用javascript oop开发滑动(slide) 菜单控件

这里使用原生的javascript&#xff0c;用面向对象的方式创建一个容易维护使用方便的滑动菜单&#xff0c;调用方式如下&#xff1a;var$sliding document.getElementById("silding");vars1 newSliding();s1.commands $sliding.getElementsByTagName("dt");…

他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他

全世界只有3.14 % 的人关注了爆炸吧知识要说起我国著名的数学家&#xff0c;很多人会想到陈景润、华罗庚等人&#xff0c;这些大数学家为我国数学研究做出了卓越贡献&#xff0c;也深深影响了很多人。那么&#xff0c;像陈景润、华罗庚这些大数学家&#xff0c;他们学习数学有受…

用多媒体库 Bass.dll 播放 mp3 [8] - 实时显示左右声道的峰值

为什么80%的码农都做不了架构师&#xff1f;>>> 本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, ComCtrls;typeTForm1 class(TForm)OpenDialog1: TOpe…

最近看了两本低代码的书

月初写了一篇《你真的了解低代码平台吗&#xff1f;》&#xff0c;介绍了下我对低代码产品的一些认识&#xff0c;随后有朋友送了我两本华章出版的关于低代码的书&#xff1a;明道云的《零代码实战》和微软的《实战低代码》&#xff0c;目前市面上也就这两本关于低代码的书。因…

如何逼疯一名数学系学生?

全世界只有3.14 % 的人关注了爆炸吧知识今天在知乎竟看到这样一个问题但看在关注人数如此之多超模君就放下成见稍微透露一下我们的“底线”到底要怎样做才能激怒数学系学生数学沾边法顾名思义只要和数学沾边就可以开怼在菜市场算菜钱时在提问后的0.5秒迅速补上致命一刀经过彩票…

WinAPI: 钩子回调函数之 MouseProc

为什么80%的码农都做不了架构师&#xff1f;>>> MouseProc(nCode: Integer; {}wParam: WPARAM; {}lParam: LPARAM {} ): LRESULT; {}//待续...转载于:https://my.oschina.net/hermer/blog/320962

内推!字节、阿里、网易火热招聘中,内推优筛简历,快人一步拿offer,真香!(送内推码)...

全世界只有3.14 % 的人关注了爆炸吧知识“金三银四”可谓招聘的黄金期。一方面&#xff0c;校园春招正如火如荼的进行中&#xff0c;另一方面&#xff0c;各大企业也纷纷启动了暑假实习招聘。对于2020届的同学来说&#xff0c;务必要利用好“应届生”这个身份&#xff0c;把握住…

如何将10进制转成16进制,又如何将16进制数转成10进制,C#和VB代码?

方法1&#xff1a; int d10; d.ToString("x") //或把x改为&#xff38;&#xff0c;&#xff0c;&#xff0c;就变成了&#xff11;&#xff16;位的字符串了&#xff0e; int xConvert.ToInt32(d.ToString("x"),16);&#xff0f;&a…

本科4篇顶会论文如何做到?清华特奖高天宇干货分享:我是这样写论文、做实验、与导师相处...

全世界只有3.14 % 的人关注了爆炸吧知识本科生&#xff0c;距离“科研”有多远&#xff1f;有人还处在“小朋友你是否有很多问号”的状态&#xff0c;但也有人本科就连发顶会文章&#xff0c;光环闪瞎众人。其中可有什么秘诀&#xff1f;清华本科特奖获得者、清华计算机大四学生…

java final 修改_“无法改变的设计”——浅谈Java中的final关键字

在Java中&#xff0c;final关键字可以用来修饰类、变量(包括成员变量和局部变量)、方法&#xff0c;下面从这三个方面分别说明。final方法当一个方法被final修饰时&#xff0c;表明这个方法不能被子类重写。下面程序试图重写final方法&#xff0c;将会引发编译错误。public cla…

一致性 hash 算法( consistent hashing )

consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出&#xff0c;目前在cache 系统中应用越来越广泛&#xff1b; 1 基本场景 比如你有 N 个 cache 服务器&#xff08;后面简称 cache &#xff09;&#xff0c;那么如何将一个对象 obje…

复工之后,如何让自己的时间更值钱

全世界只有3.14 % 的人关注了爆炸吧知识时间最不偏私给任何人都是二十四小时时间也最偏私给任何人都不是二十四小时而如何让自己的时间更值钱以下公众号或许能给你一些启示赶快扫码关注吧&#xff01;RSS精选ID&#xff1a;KindleNewsRSS精选是一个专注于时间管理iOS相关及Kind…

selenium autoit java_Java+Selenium——AutoIt工具处理文件上传

关于文件上传&#xff0c;这边介绍一个第三方工具&#xff0c;叫AutoIt&#xff0c;简单来说&#xff0c;这个是一个能支持桌面GUI自动化的工具&#xff0c;它支持脚本语言编写。这里&#xff0c;我们用AutoIt来做文件上传的演示。在Selenium脚本中如果需要AutoIt来协助这个文件…

Blazor+Dapr+K8s微服务之开发环境调试

1 安装Dapr开发调试环境1.1 Dapr 完整安装模式不支持开发调试在上一篇随笔《BlazorDaprK8s微服务之服务调用》中&#xff0c;我们通过为每个微服务运行dapr run ….dotnet run命令&#xff0c;以自宿主的方式在本地开发环境成功运行了服务调用的例子。但是&#xff0c;这种运行…

这10个人,总是牛逼的无话可说

全世界只有3.14 % 的人关注了爆炸吧知识终于迎来知识君最喜欢的工作日了。热爱工作的知识君还是在认真地看书&#xff0c;码字。哈哈哈&#xff0c;有模友知道看得是什么书然而在拍完照片后&#xff0c;还是得想想今晚该写些啥东西。狄拉克 保罗狄拉克(Paul Adrien Maurice …

WebSocket服务器(物联网下行通知神器)

HttpServer是一个轻量级Web服务器&#xff0c;用于在嵌入式设备以及客户端环境中提供简单Web服务&#xff0c;同时也支持标准WebSocket服务。本文例程基于vs2022&#xff0c;基础例程可参考&#xff1a;https://www.yuque.com/smartstone/nx/httpserverWebSocket服务端WebSocke…

继续送假期干货——响应式图片工具smartImg

中午看《众妙之门》看到一个响应式图片处理工具&#xff08;点此查看&#xff09;的介绍&#xff0c;然后就心血来潮想着不妨自己写一个基于JQ的吧&#xff0c;于是就又有了这么一个干货给大家。 smartImg 的全部文件可以从我的Github上下载&#xff0c;其实它非常小巧&#xf…