Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

前言

这次主要分享通过Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警方案。通过执行耗时,定位哪些接口拖累了服务的性能;通过请求频次,设置适当的限流和熔断机制,拦截非法或不合理的请求,保障服务的可用性。

InfluxDB

官网:https://www.influxdata.com/

按照官方的说法,InfluxDB是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

下载地址:https://portal.influxdata.com/downloads,解压后的目录如下

打开配置文件,设置数据存储路径

[data]
# The directory where the TSM storage engine stores TSM files.
#dir = "/var/lib/influxdb/data"
dir = "C:/Users/001wa/Desktop/software/influxdb-1.2.2-1/data" # The directory where the TSM storage engine stores WAL files.
#wal-dir = "/var/lib/influxdb/wal"
wal-dir = "C:/Users/001wa/Desktop/software/influxdb-1.2.2-1/data"

开启管理界面

[admin]
# Determines whether the admin service is enabled.
enabled = true # The default bind address used by the admin service.
bind-address = ":8083"

cmd到当前目录,使用配置文件influxdb.conf启动服务后,可以查看管理页面http://127.0.0.1:8083/

至此,服务启动成功。

创建数据库并改变默认策略,并创建具有管理员权限的账户

CREATE DATABASE "db_metrics"
CREATE RETENTION POLICY "rp_metrics" ON "db_metrics" DURATION 10w REPLICATION 1 DEFAULT CREATE USER "admin" WITH PASSWORD 'admin' WITH ALL PRIVILEGES

Metrics.Net

现有多个Metrics及其扩展的版本:

https://github.com/etishor/Metrics.NET 该版本的作者据说去天堂了,期望天堂里没有程序员这个职业。

https://github.com/davidB/metrics-influxdb 这个扩展支持的Influxdb版本太低,高版本会报异常,无奈放弃。

https://github.com/Recognos/Metrics.NET这个版本每个时间周期都会向数据源推数据,如果这段时间内没有数据则默认用上个周期的数据,并且数据会累计,导致重复,不便于统计和展示。

https://github.com/Recognos/Metrics.NET.InfluxDB这个版本的扩展不错。

最终选择后面两个,并对源码做了一点扩展和二次开发,基础SDK主要封装Metrics的基础操作和修复上述重复、累计问题,并注册全局的环境、主机的自定义Tags。

            Metric.Config.WithReporting(report => report
.WithInfluxDbMyHttp(host, port, database, userName, password, null, null, TimeSpan.FromSeconds(intervalSeconds), null, configFunc => configFunc
.WithConverter(new DefaultConverter().WithGlobalTags($"env={environment},host={Dns.GetHostName()}"))
.WithFormatter(new DefaultFormatter().WithLowercase(true))
.WithWriter(new InfluxdbHttpWriter(configFunc, batchSize))));

之后在基础sdk上扩展一个用于统计webapi接口耗时和频次的sdk。

    /// <summary>
/// WebAPI接口过滤器
///
/// 记录接口耗时、频次,记录到Metrics
/// </summary>
public class MetricsFilterAttribute : ActionFilterAttribute

主要采用Histogram,并自定义Tags便于Grafana的筛选

                if (stopWatch != null)
{
stopWatch.Stop(); var tags = new string[] { $"method={actionExecutedContext.Request.Method.ToString()}" };
var metricsName = FormatMetricsName(actionExecutedContext.ActionContext.ActionDescriptor);
//build and update histogram
var histogram = GetOrAddHistogram(metricsName, tags);
histogram.Update(stopWatch.ElapsedMilliseconds);
}

WebAPI引用后,要注册全局的过滤器

            config.Filters.Add(new MetricsFilterAttribute());

Grafana

Grafana是一个非常好看的监控界面,从这里下载:https://grafana.com/grafana/download

启动服务,打开登陆页面http://localhost:3000,使用默认账号登陆。

这里主要关注数据源的配置和图表的画法,不再详述用户分组权限的管理和自动化预警,想了解更多可以参考官方文档:http://docs.grafana.org/guides/getting_started/

首先添加数据源,设置数据源的类型、地址、数据库、通信方式等。

之后,自定义模板,将自定义的Tags作为筛选项,并设置数据源、筛选条件。

最终的效果为:

接下来,自定义图表

设置标题

选择自己的数据库和查询字段,比如采用Histrogram直方图记录单位时间内的执行次数和耗时分布

因为耗时和访问次数属于不同的维度,这里要设置两个Y坐标

显示一些聚合数据

设置我们要展示图形格式

最终效果为

熔断

为了保证单个接口或服务的可用性,通常针对单个用户账户、单个调用方ip在某个时间段内的访问频次进行限制,拦截恶意的请求,保障服务的可用性。

可以在Grafana中设置预警阈值,直接调用接口,对用户或ip进行访问拦截等。

后语

这篇是线上服务的可用性保障方案的其中一篇,其它的内容会后续补充:

1.对Web、H5、App相关页面进行埋点,统计用户访问的PV、UV、停留时间、转化率等。

2.VSAnalyseTool本地调试分析接口的耗时、内存、CPU的使用情况,直接定位问题、优化代码。
  接口性能分析与优化

3.SoapUI对接口进行并行压力测试,针对性改善接口性能。

4.Metrics.net + influxdb + grafana对API进行埋点。

5.完善日志系统,记录请求和响应及耗时,标识一次完整的请求,便于查找和定位问题。

6.对EntityFramework进行轻度包装,支持AsNoTracking、自动nolock、记录SQL执行耗时、读写分离等。

7.zabbix监控服务器的内存、线程、CPU Average、CPU Load、IO等,设置阈值、及时预警,保障线上的可用性。

8. WinDbg分析线上服务异常时的内存转储文件,排查大对象、高频回收、线程耗时、死锁等问题。

  高CPU、数据库无法读写的真凶

  Windbg DUMP分析(原创汇总)

  记一次内存泄漏DUMP分析

 
 

WebAPI的自动化监控和预警的更多相关文章

  1. Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

    前言 这次主要分享通过Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警方案.通过执行耗时,定位哪些接口拖累了服务的性能:通过请求频次,设置适当的限流 ...

  2. 使用 Metrics.net + influxdb + grafana 搭建项目自动化监控和预警方案

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_25042791/article/d ...

  3. 自动化监控利器-Zabbix

    转自: http://www.xuliangwei.com/xubusi/117.html   1.1为何需要监控系统 在一个IT环境中会存在各种各样的设备,例如:硬件设备.软件设备.其系统的构成也是 ...

  4. Legolas工业自动化平台案例 —— 水源地自动化监控系统

    天津港爆炸事件后,除了安置群众.追究事故责任外,人们最关心的莫过于爆炸污染物对于周边环境的影响,其中最重要的一块就是饮用水的安全.所幸的是,水源的安全监测是实实在在有据可依的.环保单位和供水企业在建设 ...

  5. 第5章Zabbix自动化监控

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  6. Linux下自动化监控内存、存储空间!

    距离上一次更新文章已经过去一段时间了,小编在这段时间因为一些琐事,加上身体生病不能及时更新文章,今天身体逐渐恢复就急忙来更新文章,今天思梦给大家带来的就是如何自动化监控我们的服务器一些基本的配置来保证 ...

  7. zabbix实现百台服务器的自动化监控--技术流ken

    前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...

  8. 自动化监控白皮书——WAS监控

    WebSphere(WAS)是一些大型企业常用的中间件,由于was自身提供的工具有时不能满足多样化的监控需求,而我们又会经常遇到对was进行监控的应用场景,所以我们有必要自己动手做一些was的监控脚本 ...

  9. Docker容器的自动化监控实现

    本文由  网易云 发布. 近年来容器技术不断成熟并得到应用.Docker作为容器技术的一个代表,目前也在快速发展中,基于 Docker的各种应用也正在普及,与此同时 Docker对传统的运维体系也带来 ...

随机推荐

  1. 洛谷—— P3225 [HNOI2012]矿场搭建

    https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...

  2. HDU 4332 Contest 4

    顶好的一道题.其实,是POJ 2411的升级版.但POJ 2411我用的插头DP来做,一时没想到那道题怎么用状态DP,于是回头看POJ 2411那一道的状态DP,其实也很简单,就是每一行都设一个状态, ...

  3. JDBC-连接数据库代码

    package com.zxc.connection; import java.sql.Connection; import java.sql.DriverManager; public class ...

  4. dexposed框架Android在线热修复

    移动client应用相对于Webapp的最大一个问题每次出现bug,不能像web一样在server就完毕修复,不须要发版本号.紧急或者有安全漏洞的问题, 假设是Webapp你可能最多花个1,2个小时紧 ...

  5. [Android] Android开发优化之——从代码角度进行优化

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就 ...

  6. python解压,压缩,以及存数据库的相关操作

    zipfile实现压缩整个目录和子目录 import os,shutil,zipfile,glob def dfs_get_zip_file(input_path,result): # files = ...

  7. OKHttp使用简介

    现在android网络方面的第三方库很多,volley,Retrofit,OKHttp等,各有各自的特点,这边博客就来简单介绍下如何使用OKHttp. 梗概 OKHttp是一款高效的HTTP客户端,支 ...

  8. 今天犯的一个错误,导致method GET must not have a request body

    事件经过: 1.在本地机器运行完全正常的程序,手动人工发包到测试环境上,后台日志频频报method GET must not have a request body. 2.使用postman发送pos ...

  9. C语言学习小记

    2013年1月31日 今天试着编程为报文去头去尾.   #include #include #define MAX_LENTH 1024 int main() {  char *path = &quo ...

  10. LeetCode 190. Reverse Bits (算32次即可)

    题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...