SpringELFilter整体结构技术栈安装启动/index.
优采云 发布时间: 2021-08-16 02:42SpringELFilter整体结构技术栈安装启动/index.
弹簧 EL 过滤器
夜莺
分离过滤器
整体结构
技术栈
SpringBoot + Nacos + Vue + ElementUI
安装
启动前需要安装依赖
安装nacos(存储监控配置)
使用 Prometheus 作为采集器
安装普罗米修斯
安装pushgateway
使用夜莺作为采集器
使用 Open-Falcon 作为采集器
启动
启动 AnyMetrics
1 mvn clean package
2 cd boot/target
3 java -Dnacos.address=nacos.ip:8848 -Dnacos.config.dataId=AnyMetricsConfig -Dnacos.config.group=config.app.AnyMetrics -Dauto=true -jar AnyMetrics-boot.jar
启动参数说明
通过 nacos.address 参数指定nacos地址
通过 nacos.config.dataId 参数指定配置在nacos的dataId,默认值为 AnyMetricsConfig
通过 nacos.config.group 参数指定配置在nacos的group,默认值为 DEFAULT
通过 auto 参数控制任务是否自启动,默认值为 false
启动后访问:8080/index.html
如何配置采集task1、select 任务类型
2.1、有界数据
选择调度间隔,单位:秒
2.2、选择数据源
选择数据源为mysql(以mysql为例),完善相关配置
3.1、无界数据
进入时间窗口,单位:秒
3.2、选择数据源
选择kafka作为数据源(以kafka为例),完善相关配置
4、采集规则
过滤器支持 4 种类型的正则、el、JSON 和 split。经常使用括号来提取所需的变量。多个变量以$1、$2 ... $N 的形式命名;你可以在 el 中使用 el。使用 _#$1 _ 变量进行计算;在 JSON 中,键将用作变量名。在split中,一个字符串可以被分割成多个变量,命名方式为$1、$2 ... $N
5、collector
选择prometheus(目前支持prometheus、open-falcon、nightingale)并完善metrics相关配置信息,type支持gauge、counter、histogram类型,labels支持$1变量,value支持Spring EL表达式变量操作
运行 task1、Start task
点击开始按钮开始任务
2、查看操作日志
点击Logs Tab查询任务运行日志
3、iframe
点击iframe Tab将外部系统嵌入到任务中,比如将grafana仪表盘链接嵌入到系统中进行展示
4、停止任务
点击停止按钮停止任务
示例1:采集所有执行时间超过3秒的慢速链接并配置告警策略
慢链接数据源的来源可以是调用日志或*敏*感*词*打印的接口耗时日志
1、设置kafka为数据源,从kafka读取trace日志
{
"groupId":"anymetrics_apm_slow_trace",
"kafkaAddress":"192.168.0.1:9092",
"topic":"p_bigtracer_metric_log",
"type":"kafka"
}
2、设置采集规则
假设调用链日志是如下结构化数据,如:
1617953102329,operation-admin-web,10.8.60.41,RESOURCE_MYSQL_LOG,com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList,1,1,0,0,1
因此,第一步是使用正则性对数据进行提取过滤(或者可以使用Split Filter根据“,”提取数据),对应的正则性为:
(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)
提取的数据为:
{
"$4":"RESOURCE_MYSQL_LOG",
"$5":"com.yxy.operation.dao.IHotBroadcastEpisodesDao.getNeedOnlineList",
"$6":"1",
"$7":"1",
"$10":"1",
"$8":"0",
"$9":"0",
"$1":"1617953102329",
"$2":"operation-admin-web",
"$3":"10.8.60.41"
}
获得了 10 个变量,从 1 美元到 10 美元不等。由于监控是3秒以上的慢速链路,我们只需要采集RT超过3秒的日志数据,所以需要定义一个逻辑运算表达式Filter,对应的EL表达式为:
(new java.lang.Double(#$10) / #$6) > 3000
其中#$10为链接总响应时间,#$6为接口调用总数,先通过#$10/#$6计算平均RT,然后通过(#$10/#$6)> 3000 慢速链接数据超过 3 秒
根据以上两条采集规则,完整的配置为:
{
"timeWindow": 40,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\u0001,(.*?)\n",
"type": "regular"
},
{
"expression": "(new java.lang.Double(#$10) / #$6) > 3000",
"type": "el"
}
]
}
3、设置采集器
采集数据到prometheus
{
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_apm_slow_trace",
"labelNames": [
"application",
"type",
"endpoint"
],
"name": "anymetrics_apm_slow_trace",
"type": "gauge",
"value": "new java.lang.Double(#$10) / #$6",
"labels": [
"$2",
"$4",
"$5"
]
}
],
"type": "prometheus",
"job": "anymetrics_apm_slow_trace"
}
需要定义 Promethus 指标。名称是anymetrics_apm_slow_trace,类型是gauge。 LabelNames使用application、type、endpoint,对应变量$2、$4、$5,因为集合是响应时间RT,所以取值为#$10/#$6
其中#$10为链接总响应时间,#$6为接口总调用次数,平均RT按#$10/#$6计算
4、配置报警和可视化
4.1 可视化
打开Grafana,创建Panel,选择数据源为promethus,图标类型为Graph,在Metrics anymetrics_apm_slow_trace中输入PromQL语法{}
PromQL 可以参考
4.2 配置 Grafana 警报
以Grafana作为报警平台为例配置报警策略:
在 Panel 中选择 Alert Tab 并定义警报规则,例如:
Evaluate every 1m For 1m 第一个 1m 表示以 1 分钟的频率检查是否满足报警条件。第二个 1m 表示满足条件时报警状态从 OK 变为 Pending。此时不会触发报警,但 Pending 状态会持续 1 分钟。在 Pending 状态下,如果下次检查再次满足条件,则会触发报警
条件设置 Max() OF query(A,5m,now) IS ABOVE 3000 表示比较过去 5 分钟的最高值是否超过 3000
NoData & Error Handing 用于设置获取数据超时或无数据时是否需要触发报警
Notifications 配置发送到报警通道,可以是钉钉、邮箱等。
一个比较完整的APM监控组合如下:
链接RT、项目错误数、项目平均RT、链接RT分布的多维度监控通过调用链日志采集不同维度的度量完成@
例2:可视化显示注册用户总数1、设置mysql为数据源,根据sql查询用户总数
{
"password": "root",
"jdbcurl": "jdbc:mysql://192.168.0.1:3306/user",
"type": "mysql",
"sql": "select count(1) as total from user",
"username": "root"
}
2、设置采集规则
查询得到的原创数据格式为{"total": 1},因此使用JSON过滤器获取key=total和value=1的变量:
{
"kind": "schedule",
"interval": 5,
"filters": [
{
"type": "JSON"
}
]
}
3、设置采集器
采集promethes中的数据,值为#total
{
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "anymetrics_member_count",
"name": "anymetrics_member_count",
"type": "gauge",
"value": "#total"
}
],
"type": "prometheus",
"job": "anymetrics_member_count"
}
需要定义promethus metrics,名称为anymetrics_member_count,类型为gauge,因为只需要采集用户总数,所以不需要定义labels和labelNames
4、配置可视化
打开Grafana,创建Panel,选择数据源为promethus,图标类型为Graph,在Metrics anymetrics_member_count中输入PromQL语法{}
例3:Nginx日志监控Nginx请求延迟监控,Nginx状态码监控1、设置kafka为数据源,消耗nginx access_log日志
{
"groupId":"anymetrics_nginx",
"kafkaAddress":"192.168.0.1:9092",
"topic":"nginx_access_log",
"type":"kafka"
}
2、设置采集规则
假设nginx的log_format配置如下:
log_format main '"$http_x_forwarded_for" $remote_addr - $remote_user [$time_local] $http_host "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $upstream_addr $request_method $upstream_status $upstream_response_time';
所以第一步就是使用正则Filter对数据进行提取过滤,对应的正则为:
(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
提取的数据为:
$1:"-"
$2:192.168.198.17
$3: -
$4:13/Apr/2021:10:48:14 +0800
$5:dev.api.com
$6:POST
$7:/yxy-api-gateway/api/json/yuandouActivity/access
$8:HTTP/1.1"
$9:200
$10:87
$11:http://192.168.0.1:8100/yxy-edu-web/coursetrialTemp?id=123
$12:Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)Mobile/15E148 MicroMessenger/7.0.11(0x17000b21)NetType/WIFI Language/zh_CN
$13:10.8.43.18:8080
$14:POST
$15:200
$16:0.005
一共得到16个变量,通过对比log_format我们可以分别知道每个变量的含义。
完整的采集规则配置为:
{
"timeWindow": 30,
"kind": "stream",
"filters": [
{
"expression": "(.*?)\\s+(.*?)\\s+-(.*?)\\s+\\[(.*?)\\]\\s+(.*?)\\s+\\\"(.*?)\\s+(.*?)\\s+(.*?)\\s+\\\"?(\\d+)\\s+(\\d+)\\s\\\"(.*?)\\\"\\s+\\\"(.*?)\\\"\\s+(.*?)\\s+(.*?)\\s+(\\d+)\\s+(.*)",
"type": "regular"
}
]
}
3、设置采集器
采集每个请求的响应时间和请求的状态码,并将数据存入promethes
{
"pushGateway": "192.168.0.1:9091",
"metrics": [
{
"help": "nginx_log_host_status",
"labelNames": [
"host",
"status"
],
"name": "nginx_log_host_status",
"type": "gauge",
"value": "1",
"labels": [
"$5",
"$9"
]
},
{
"help": "nginx_log_req_rt (seconds)",
"labelNames": [
"host",
"endpoint"
],
"name": "nginx_log_req_rt",
"type": "gauge",
"value": "new java.lang.Double(#$16)",
"labels": [
"$5",
"$7"
]
}
],
"type": "prometheus",
"job": "anymetrics_nginx_log"
}
4、配置可视化Nginx状态码监控
打开Grafana,创建Panel,选择数据源为promethus,图标类型为Graph,在Metrics nginx_log_host_status中输入PromQL语法{}
Nginx 请求延迟监控
打开Grafana,创建Panel,选择数据源为promethus,图标类型为Graph,在Metrics nginx_log_req_rt中输入PromQL语法{}
完整的demo配置如下
APM-慢速链接监控
APM-Nginx 日志监控
APM-用户总数的可视化展示
AnyMetrics 和 MicroMeter 的区别
Micrometer 为最流行的监控系统提供了一个简单的仪器客户端外观,允许对 JVM 应用程序进行检测,而无需担心由哪个供应商提供指标。它的功能类似于 SLF4J,不同之处在于它不关注日志记录,而是关注应用程序指标。总之就是应用监控行业的SLF4J
差异 MicrometerAnyMetrics
操作模式
在用户进程中运行
独立进程运行
如何使用
在应用中的代码中买分,主要看指标
无埋点采集,基于应用运行日志,基于规则配置聚合指标,以日志为主
数据纬度
根据单个应用的纬度采集数据,聚焦单个应用的数据
全球数据聚合,关注整体趋势
监控系统
AppOptics、Azure Monitor、Netflix Atlas、CloudWatch、Datadog、Dynatrace、Elastic、Ganglia、Graphite、Humio、Influx/Telegraf、JMX、KairosDB、New Relic、Prometheus、SignalFx、Google Stackdriver、StatsD、Wavefront
支持 Prometheus、Nightingale、Open-Falcon
跨平台
仅支持 Java 平台
跨平台,支持任意应用的日志数据,同时支持有界数据和无界数据
Q&A 如何采集APM 日志?
如果系统中有调用链跟踪系统,可以使用调用链日志,或者通过定义*敏*感*词*来打印目标方法的日志。日志格式定义好后,可以直接按行打印,也可以在内存中聚合后按固定频率打印,日志一般收录RT延迟、错误/成功次数、端点、应用程序等关键数据。
Kafka如何采集日志?
可以使用filebeat采集nginx access_log和tomcat应用日志到kafka
目前支持哪些数据源?
限界数据目前支持mysql和http;无界数据目前支持kafka
目前支持哪些采集器?如果我已经使用过 Skywalking 和 Zipkin 等调用链跟踪系统,还需要使用 AnyMetrics 吗?
两者没有冲突。调用链跟踪系统采集链接调用关系和APM指标数据。 AnyMetrics不仅可以使用结构化调用链跟踪系统指标日志作为数据源来监控系统,还可以应用应用系统中的非结构化日志作为数据源来监控系统的运行,比如监控一些异常事件,还可以直观地显示或监控数据库的表数据。同时,AnyMetrics支持跨平台系统,系统产生的任何日志都可以作为数据源,用于监控系统运行情况