网站首页 > 技术文章 正文
一、 前奏
这段时间在完善kibana中实现预警机制,通过Sentinl实现。关于sentinl的使用就不做介绍了,这个插件功能还是很强大的,可以实现邮件预警及通过webhook接口的方式实现微信预警。sentinl中对预警数据的筛选是通过ES的DSL查询语句实现的。
二、问题场景
现在有这么个场景对zk的服务数进行预警,我们建了一个服务实施的通过zk注册中心正常的服务数,然后通过filebeat收集相关服务数日志,如果服务异常我们通过sentinl对日志进行筛查后实现预警。
相关的预警脚本如下:
{ "query": { "bool": { "must": [ { "term": { "tags": "nlp-log-monitor" } }, { "range": { "zootemAbnMsg": { "gte" : 1 } } }, { "range": { "@timestamp": { "gte": "now-30s", "lte": "now", "format": "epoch_millis" } } } ] } } }
这段脚本的主要含义是查询当前时间30s内,服务nlp-log-monitor中异常服务数“zootemAbnMsg”大于1的日志,如果扫描到了,则通过sentinl预警。
term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
最终的提示脚本:
dubbo服务数预警|{{payload.hits.total}}|ERROR dubbo服务数异常,宕机应用数:{{payload.hits.hits.0._source.zootemAbnMsg}},宕机应用:{{payload.hits.hits.0._source.zootemAbnMsgParam}}
但是上面的脚本是无法查询到数据的,“term”是需要not_analyzed ,ES里默认的分词器为standard。
我们通过命令分析下“nlp-log-monitor”是否被分词了。
POST http://10.XXX.XX.XXX:8200/logstash-2019.07.12/_analyze {"text":"nlp-log-monitor"}
返回结果如下:
{ "tokens": [ { "token": "nlp", "start_offset": 0, "end_offset": 3, "type": "<ALPHANUM>", "position": 0 }, { "token": "log", "start_offset": 4, "end_offset": 7, "type": "<ALPHANUM>", "position": 1 }, { "token": "monitor", "start_offset": 8, "end_offset": 15, "type": "<ALPHANUM>", "position": 2 } ] }
我们发下“nlp-log-monitor”被分词了,想要改变这个我们就需要引用其他的分词器。这里推荐使用ik分词器。关于ik分词器的安装网上有很多资料,主要需要注意安装的版本需要和es版本一致。分词器安装完成后,网上有很多方式说可以在es的config/elasticsearch.yml文件中配置,6.x版本后就不需要指定了。这里需要注意下。
三、logstash配置分词器
分词器的配置方式有很多种,比如在es中初始化时配置,由于我们使用的是logstash自动生成es索引的方式这里我们采用在logstash配置分词模板的方式:
1.在logstash的安装目录config下建立分词模板yrz-logstash.json
{ "index_patterns": ["yrz-logstash-*"], "settings": { "number_of_shards": 3 }, "mappings": { "doc": { "dynamic_templates": [{ "es": { "match": "message", "match_mapping_type": "string", "mapping": { "type": "text", "analyzer": "ik_smart" } } }, { "en": { "match": "tags", "match_mapping_type": "string", "mapping": { "type": "keyword", "analyzer": "ik_smart" } } }, { "ea": { "match": "*", "match_mapping_type": "string", "mapping": { "norms": false, "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }] } }, "aliases": {} }
模板中参数的具体含义网上都可以找到, “match”: “tags”,这里就是我们指定了tags的分词方式为“ik_smart”。
es中初始导入可以通过命令PUT http://10.xxx.xx.xxx:8200/_template/yrz-logstash导入。
logstash启动conf文件中新增如下配置:
output { if [type] == "filebeat"{ elasticsearch { hosts => ["10.xxx.xx.xxx:8200"] index => "yrz-logstash-%{+YYYY.MM.dd}" action => "index" template=>"/usr/local/nlp/logstash-6.0.1/config/yrz-logstash.json" template_name=>"yrz-logstash" #manage_template => true template_overwrite => true user => "elastic" password => "xxxx" } } ........ }
配置完成后启动相关服务,后续的日志我们就可以按照新的分词规则往es中记录数据。
后面在kibana中发现了tags.keyword,我们在配置sentinl是可以改为如下一样可以精确匹配到我们的数据:
{ "term": { "tags.keyword": "nlp-log-monitor" } }
keyword:存储数据时候,不会分词建立索引,text:存储数据时候,会自动分词
申明:头条上发版文章主要来自本人CSDN账号,非抄袭!!!
猜你喜欢
- 2024-10-29 你还在用 Date?快使用 LocalDateTime 了!
- 2024-10-29 Java修炼终极指南:79,80,81 签到终极修炼天赋
- 2024-10-29 硬核!最全的延迟任务实现方式汇总!附代码(强烈推荐)
- 2024-10-29 还在实体类中用Date?JDK8新的日期类型不香么?
- 2024-10-29 LocalDateTime 说:2020,是时候换个更好的日期时间类了
- 2024-10-29 程序员,你还在使用Date嘛?建议你使用LocalDateTime哦
- 2024-10-29 深度思考:在JDK8中,日期类型该如何使用?
- 2024-10-29 为什么建议使用你 LocalDateTime,而不是 Date?
- 2024-10-29 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题
- 2024-10-29 DeepLearning4j 实战:手写体数字识别的 GPU 实现与性能对比
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)