【云原生•监控】mtail轻量日志监控系统

news2024/11/26 4:33:00

【云原生•监控】mtail轻量日志监控系统

前言

「笔者已经在公有云上搭建了一套临时环境,可以先登录体验下:」

http://124.222.45.207:17000/login
账号:root/root.2020

简介

「可观测性平台三大支柱:日志监控、调用链监控和度量指标监控,其中最为大家熟知的是日志监控,因为我们开发系统基本都离不开日志,也是解决问题最为常见的一种方式。日志的特点就是它是一个个离散的事件,因为一个事件的产生所以导致了一条日志的产生,用于问题分析判断时提供更为详尽的线索。」

举个例子:如程序突然无法连接MySQL数据库,通过异常日志(如下)很容易发现是由于Too many connections导致数据库连接失败:

[ERROR] [2023-05-20 21:14:43] com.alibaba.druid.pool.DruidDataSource.init(629) | init datasource error
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
    at com.mysql.jdbc.Util.getInstance(Util.java:383)

Too many connections这种异常通常是由于超过MySQL服务器允许的最大连接数而引起的,可以通过增加数据库连接数或关闭未使用的连接来解决该问题。从这个示例可以看出:「日志监控对异常情况下问题分析更加直接,比如请求参数、异常事件等,为问题分析判断提供更为详尽的线索;调用链监控偏向请求调用的链路分析,往往用于发现链路间性能问题;而度量指标监控特点是数值类型,往往用于统计聚合或提供性能指标的运行趋势情况,需要丰富经验才能发现潜在问题,一般为问题分析定位过程中可能的猜测提供有效的数据支撑依据,如上述Too many connections导致数据库连接异常,就可以通过度量指标查看MySQL的连接数进行佐证,并通过连接数趋势线查看什么时间点开始出现连接数异常上升进行进一步的分析排查。」

「说到日志监控,大家第一反应的可能是ELK的方案,或者Loki的方案,这两个方案都是把日志采集了发到中心,在中心存储、查看、分析。这种日志方案问题是使用elasticsearch,存储量非常大,巨大的全文索引开销,如一套ELK监控系统一天新增的日志存储量可能会上TB;另一个问题就是这些日志是离散的,而且是海量的,不太方便进行聚合统计。」

然后,在实际生产中往往还有如下需求:

  • 如根据日志统计某个业务接口一天的调用量,从而获取业务订单量、支付金额等;

  • 日志中触发Error的次数,以及想知道每天都触发了哪些Error,每种Error触发次数统计等;

  • 基于日志关键字告警:

    • 如上述MySQL连接异常: Too many connections

    • jvm内存溢出:java.lang.OutOfMemoryError: Java heap space

    • 如连接拒绝:java.net.ConnectException: Connection refused

如上述需求并不需要全量的日志,所以,可以通过日志转度量指标解决:「将日志流消息转换计算后生成度量指标,然后监控系统抓取使用PromQL语法进行聚合统计分析」

这里给大家介绍一个Google出品的工具mtailmtail就是流式读取日志,通过正则表达式匹配的方式从日志中提取metrics指标,这种方式可以利用目标机器的算力,另外一个好处是无侵入性,不需要业务埋点,如果业务程序是第三方供应商提供的,我们改不了其代码,mtail此时就非常合适了。

mtail安装使用

1、mtail安装:

[root@VM-4-14-centos tools]# mkdir /disk/tools/mtail
[root@VM-4-14-centos tools]# cd /disk/tools/mtail
[root@VM-4-14-centos mtail]# tar -zxvf mtail_3.0.0-rc51_Linux_x86_64.tar.gz

2、mtail启动:

[root@VM-4-14-centos mtail]# ./mtail --progs /disk/tools/mtail/conf --logs '/disk/tools/mtail/logs/*.log' --logs /var/log/messages --log_dir /disk/tools/mtail/logdir --poll_interval 250ms

「核心参数如下:」

1、--progs:指定一个目录,这个目录里放置一堆的*.mtail文件,每个mtail文件就是描述的正则提取规则

2、--logs:监控的日志文件列表,可以使用,分隔多个文件,也可以多次使用--logs参数,也可以指定一个文件目录,支持通配符,指定文件目录时需要对目录使用单引号。如:--logs a.log,b.log,c.log --logs a.log --logs b.log --logs c.log --logs '/export/logs/*.log'

3、--log_dirmtail组件自身日志存放目录

4、--portmtail组件http监听端口,默认3903

mtail启动之后会自动监听一个端口3903,在3903的/metrics接口暴露符合Prometheus协议的监控数据,Prometheus 或者 Categraf 或者 Telegraf 等就可以从 /metrics 接口提取监控数据。

这样看起来,原理就很清晰了,mtail 启动之后,根据 --logs 找到相关日志文件,seek 到文件末尾,开始流式读取,每读到一行,就根据 --progs 指定的那些规则文件做匹配,看是否符合某些正则,从中提取时序数据,然后通过3903的/metrics暴露采集到的监控指标。

规则语法

mtail的目的是从日志中提取信息并将其传递到监控系统。因此,必须导出指标变量并命名,指标支持countergaugehistogram三种类型,并且命名的变量必须在COND脚本之前。

标准格式为:

COND {
  ACTION
}

其中COND是一个条件表达式。它可以是正则表达式,也可以boolean类型的条件语句。如下:

/foo/ {
  ACTION1
}

variable > 0 {
  ACTION2
}

/foo/ && variable > 0 {
  ACTION3
}

COND表达式可用的运算符如下:

  • 关系运算符:

< , <= , > , >= , == , != , =~ , !~ , || , && , !

  • 算术运算符:

| , & , ^ , + , - , * , /, << , >> , **

「导出的指标变量」可用的运算符如下:

= , += , ++ , –

规则示例

「1、导出一个counter类型的指标lines_total:统计日志行数」

# simple line counter
counter lines_total
/$/ {
  lines_total++
}

「2、导出一个counter类型的指标error_count:统计出现ERROR、error、Failed、faild这四个关键字的日志行数」

counter error_count
 
/ERROR|error|Failed|faild/ {
  error_count++
}

「3、导出一个counter类型的指标out_of_memory_count:统计内存溢出出现次数」

counter out_of_memory_count
 
/java.lang.OutOfMemoryError/ {
  out_of_memory_count++
}

转成度量指标后,结合PromQL语法很容易进行预警规则配置:

groups:
- name: memory.rules
  rules:
  - alert: OutOfMemoryError
    expr: increase(out_of_memory_count[1m]) > 0
    labels:
      severity: series
    annotations:
      summary: "java.lang.OutOfMemoryError"
      description: "{{ $labels.instance }} 出现JVM内存溢出错误"

「4、这里我用mtail监控一下n9e-server的日志,从中提取一下各个告警规则触发的 notify 的数量,这个日志举例:」

2021-12-27 10:00:30.537582 INFO engine/logger.go:19 event(cbb8d4be5efd07983c296aaa4dec5737 triggered) notify: rule_id=9 [__name__=net_response_result_code author=qin ident=10-255-0-34 port=4567 protocol=tcp server=localhost]2@1640570430

很明显,日志中有这么个关键字:notify: rule_id=9,可以用正则来匹配,统计出现的行数,ruleid 也可以从中提取到,这样,我们可以把 ruleid 作为标签上报,于是乎,我们就可以写出这样的 mtail 规则了:

counter mtail_alert_rule_notify_total by ruleid

/notify: rule_id=(?P<ruleid>\d+)/ {
    mtail_alert_rule_notify_total[$ruleid]++
}

「5、java异常类型统计」

counter exception_count by exception, log
/(?P<exception>[A-Z]*(.[A-Za-z]*)*(Exception|Error)):(?P<log>.*)/ {
   exception_count[$exception][$log]++
}

然后向日志文件中输入空指针异常和jvm内存溢出异常:

java.lang.NullPointerException: Some error message here.
        at com.example.myapp.MyClass.someMethod(MyClass.java:123)
        at com.example.myapp.OtherClass.doSomething(OtherClass.java:45)
java.lang.OutOfMemoryError: Java heap space
Dumping heap to d://\java_pid10000.hprof ...
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at cn.intsmaze.dump.OOMDump$OOMIntsmaze.<init>(OOMDump.java:27)
 at cn.intsmaze.dump.OOMDump.fillHeap(OOMDump.java:34)
 at cn.intsmaze.dump.OOMDump.main(OOMDump.java:47)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
Heap dump file created [10195071 bytes in 0.017 secs]
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

访问/metrics端点就可以看到指标数据:

# HELP exception_count defined at gj.mtail:7:9-23
# TYPE exception_count counter
exception_count{exception="java.lang.NullPointerException",log=" Some error message here.",prog="gj.mtail"} 3
exception_count{exception="java.lang.OutOfMemoryError",log=" Java heap space",prog="gj.mtail"} 2

exception标签标识java异常类型,log标签标识简单异常描述。

注意:实际生产log标签是不太合适的,因为log标签基数太多会导致指标膨胀。

将异常指标转成度量指标,使用PromQL语法就很容易统计出每种异常类型每天触发的次数,或者结合Grafana实时展示统计数据、趋势线等。

9d76a2d831cc6f22b7b74db2ebc6f66d.gif

[更多云原生监控运维,请关注微信公众号:Reactor2020]

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

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

相关文章

2023年05月小结

5月一晃即将过去&#xff0c;先看看5月份都写了哪些文章&#xff1a; 往期推荐 国内手机号如何注册Google账号 Python中的布尔类型以及布尔值介绍 Python中深拷贝与浅拷贝介绍 Python中的集合介绍 Python中的字典学习笔记 Python学习历程-元组的基本操作回顾 记录我的Python学习…

初学prometheus监控(一)

初学prometheus监控(一) 1、promethues 介绍 1.1 监控的分类 监控重要性由高到低 业务监控&#xff1a;公司领导比较关心的指标&#xff0c;如电商平台的订单数量&#xff0c;用户的日活等系统监控&#xff1a;主要是跟操作系统相关的基本监控项&#xff0c;比如CPU,内存&#…

ChatGPT能解决信息抽取吗?一份关于性能、评估标准、鲁棒性和错误的分析

深度学习自然语言处理 原创作者&#xff1a;qazw 信息抽取(IE)旨在从非结构化文本中抽取出结构化信息&#xff0c;该结果可以直接影响很多下游子任务&#xff0c;比如问答和知识图谱构建。因此&#xff0c;探索ChatGPT的信息抽取能力在一定程度上能反映出ChatGPT生成回复时对任…

Office project 2019安装

哈喽&#xff0c;大家好。今天一起学习的是project 2019的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

英伟达股票大涨,对应 GPU 产品有哪些型号?

英伟达&#xff08;NVIDIA&#xff09;是一家知名的 GPU&#xff08;图形处理器&#xff09;制造商&#xff0c;其 GPU 产品线非常丰富&#xff0c;涵盖了从消费级到专业级的各种型号。 最近英伟达股票大涨&#xff0c;高端 GPU 供不应求&#xff0c;搞大模型的团队都要疯狂进货…

机器学习入门基础:机器学习实践

目录 7.1 数据集划分 7.1.1 训练集、验证集和测试集划分7.1.2 交叉验证7.1.3 不平衡数据处理7.2 评价指标 7.2.1 回归的评价指标7.2.2 分类的评价指标7.2.3 评价指标案例7.3 正则化、偏差和方差 7.3.1 欠拟合和过拟合7.3.2 正则化7.3.3 偏差和方差参考文献 7.1 数据集划分 7.1…

通过python采集1688app商品详情数据,1688app商品详情数据接口,1688API接口

要通过Python采集1688app商品详情数据&#xff0c;你可以使用以下步骤&#xff1a; 安装必要的 Python 模块&#xff1a;requests, BeautifulSoup4 和 lxml。使用 requests 模块发送 HTTP 请求获取网站 HTML 内容。使用 BeautifulSoup4 模块解析 HTML 页面并提取所需的数据。编…

主路由设置静态路由后,能ping通,但无法访问网页服务和ssh等

主路由设置静态路由后&#xff0c;能ping通&#xff0c;但无法访问网页服务和ssh等 静态路由 主路由是istoreos软路由&#xff0c; AP使用华为AX3路由器做ap和wifi&#xff0c; 二级路由使用蒲公英路由X5 前置条件&#xff1a;已在主路由设置静态路由 静态路由 问 主路由设置静…

项目管理新手常见误区揭秘~

点击上方 "JavaEdge"关注, 星标或置顶一起成长 后台回复“面试”有惊喜礼包&#xff01; 这是一个纷杂而无规则的世界&#xff0c;越想忘掉的事情&#xff0c;越难忘记。 如何完成新手项目经理的角色转换呢&#xff1f; 成为项目经理前&#xff0c;我做了四五年的“码…

一起看 I/O | Jetpack 新功能一览

作者 / Android 产品经理 Amanda Alexander Android Jetpack 是现代 Android 开发 (Modern Android Development) 的关键组成支柱。Android Jetpack 套件包含超 100 个库、工具及指南&#xff0c;可帮助开发者遵循最佳实践、减少样板代码&#xff0c;并编写可在各种 Android 版…

chatgpt赋能python:Python修改配置文件:实现自动配置与简化运维

Python修改配置文件&#xff1a;实现自动配置与简化运维 介绍 配置文件是软件开发中不可缺少的一部分&#xff0c;它不仅包含应用程序的基本设置&#xff0c;还提供了一种简单的方式来管理这些设置。如何有效地修改配置文件已经成为了每个开发者必备的技能之一&#xff0c;而…

这8个NumPy函数可以解决90%的常见问题

NumPy是一个用于科学计算和数据分析的Python库&#xff0c;也是机器学习的支柱。可以说NumPy奠定了Python在机器学习中的地位。NumPy提供了一个强大的多维数组对象&#xff0c;以及广泛的数学函数&#xff0c;可以对大型数据集进行有效的操作。这里的“大”是指数百万行。 Nump…

MGR网络抖动问题分析和group_replication_unreachable_majority_timeout等参数分析

导言 本文主要从测试的角度来阐明group_replication_unreachable_majority_timeout和group_replication_member_expel_timeout参数对集群网络分区的影响&#xff0c;首先这里放一张大图&#xff0c;为多年前学习MGR的时候留下的&#xff0c;也就是这两个参数对集群的影响&…

穷途末路的阿里中台

观点| Mr.K 主笔| Wendy.L 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 对于关注K哥公众号多年的朋友来说&#xff0c;“中台”早就是老生常谈的东西了&#xff0c;如果你还不知道它是什么&#xff0c;可以看看之前的中台文章先恶补一下。 关于中台&#xff0c;这些年翻…

chatgpt赋能python:Python倒序range的完整指南

Python倒序range的完整指南 Python是一种高级编程语言&#xff0c;很多人认为它非常容易学习和使用。其中一个非常有用的功能是range()函数&#xff0c;可以生成数字序列。然而&#xff0c;有时候我们需要以相反的顺序生成这个数字序列&#xff0c;这时候倒序range()函数就派上…

5G NTN技术概述及演进分析(下)

5G NTN因其广泛的服务覆盖能力、应对物理攻击或自然灾害的健壮性和灵活性&#xff0c;在交通、公共安全、电子健康、农业、金融、汽⻋等领域有广泛的应用前景。5G NTN与地面通信的差异主要体现在高时延、广覆盖和卫星的运动等方面&#xff0c;这使得其在传输时延、多普勒频移、…

Ae:蒙版跟踪(含脸部跟踪)

蒙版跟踪&#xff0c;就是通过记录画面上蒙版区域的变化&#xff0c;生成蒙版路径 Mask Path的关键帧。 常用于完成合成中的遮挡关系&#xff0c;或者局部添加动态效果&#xff0c;以及实现人物的脸部特效。 蒙版跟踪 要使用蒙版跟踪器&#xff0c;需要先创建并选中蒙版&#x…

设计模式之~备忘录模式

备忘录&#xff08;Memento&#xff09;&#xff1a; 备忘录模式&#xff08;Memento Pattern&#xff09;又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern)。 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态…

【数据库优化-count()】count()统计行数

目录 1 count(*)为什么性能差&#xff1f; 2 优化count(*)性能 2.1 增加redis缓存 2.2 多线程执行 2.3 减少join的表 3 count的各种用法性能对比 数据库&#xff1a;Mysql8、存储引擎是Innodb。 通常情况下&#xff0c;分页接口一般会查询两次数据库&#xff0c;第一次是…

软考A计划-试题模拟含答案解析-卷十七

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…