前言

这次主要分享通过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 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分析

Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警的更多相关文章

  1. WebAPI的自动化监控和预警

    Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警 前言 这次主要分享通过Metrics.net + influxdb + grafana 构建Web ...

  2. collectd+logstash+influxdb+grafana构建windows服务器应用监控系统

    一.背景介绍 本监控方案支持对Windows Server服务器集群的全面监控,方案提供丰富的图表展示, 以及对异常问题进行邮件的实时报警. 本系统由Collectd(操作系统数据搜集).logsta ...

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

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

  4. window平台基于influxdb + grafana + jmeter 搭建性能测试实时监控平台

    一.influxdb 安装与配置 1.1 influxdb下载并安装 官网无需翻墙,但是下载跳出的界面需要翻墙,我这里提供下载链接:https://dl.influxdata.com/influxdb ...

  5. 基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控

    引言 最近逛 nmon 官网时,发现了一个新工具 njmon,功能与 nmon 类似,但输出为 JSON 格式,可以用于服务器性能统计. 可以使用 njmon 来向 InfluxDB 存储服务器性能统 ...

  6. 利用Metrics+influxdb+grafana构建监控平台(转)

    转自http://www.jianshu.com/p/fadcf4d92b0e 这里再配合Influxdb和Grafana可以构建一个非常漂亮的实时监控界面. Grafana监控界面 采集数据(Met ...

  7. 微服务监控之二:Metrics+influxdb+grafana构建监控平台

    系统开发到一定的阶段,线上的机器越来越多,就需要一些监控了,除了服务器的监控,业务方面也需要一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使 ...

  8. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429

  9. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台

    完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...

随机推荐

  1. jenkins入门系列之一 jenkins的安装

    Jenkins是一个CI(持续集成环境)工具.它可以根据设定持续定期编译,运行相应代码:运行UT或集成测试:将运行结果发送至邮件,或展示成报告... 这样做的最终目的是: 让项目保持健康的状态.如果任 ...

  2. redis requires ruby version 2.2.2的解决方案

    在执行gem install redis时 提示: gem install redis ERROR: Error installing redis: redis requires Ruby versi ...

  3. redis主从复制入门案例

    主从复制 特点: 1.master可以拥有多个slave 2.多个slave可以连接同一个master外,还可以连接到其他slave 3.主从复制不会阻塞master,在同步数据时,master可以继 ...

  4. zookeeper 内部机制学习

    zookeeper 内部机制学习 1. zk的设计目标 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图. 可靠性:具有简单.健壮.良好的性能.如果消息m被到一台服务器接收 ...

  5. Android 进程间通信

    什么鬼!单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能?没道理啊!排查半天,发现这两就不在一个进程里,才恍然大悟-- 什么是进程 按照操作系统中的描述:进程一般指一个执行单元,在 PC ...

  6. 对 url 中含有的中文进行转码操作

    对 url 中含有的中文进行转码操作 一般情况下,将带有中文的 url 拷贝到开发工具,开发工具都会有相应的转码(自动转码), 现在大部分的浏览器也可以对含有中文的 url 进行转码(自动转码) 情景 ...

  7. WinForm中使用DDE技术(含源码)

    提起DDE技术,相信很多人不知道是啥东东,尤其是90后的程序员们.不过,有时候这个东西还是有用处的,用一句话可以总结:实现Winform程序间的通信.比如:两个Winform程序A和B需要实现通信,用 ...

  8. iOS原生和H5的相互调用

    为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代 ...

  9. 通过Yii来理解MVC

    模型:是表现业务数据.规则和逻辑的对象. 可以通过集成yii\base\Model或者它的子类定义模型类. 基类yii\base\Model支持许多实用的特性: A 属性:表现业务数据,可以像普通类属 ...

  10. Nginx和php是怎么通信的?

    先来看一下搭建好PHP运行环境的Nginx配置文件. 非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastc ...