一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种自定义Prometheus收集日志信息指标的方法和系统与流程

2022-03-26 14:42:37 来源:中国专利 TAG:

一种自定义prometheus收集日志信息指标的方法和系统
技术领域
1.本发明涉及日志收集与分析技术领域,具体涉及一种自定义prometheus收集日志信息指标的方法和系统,基于kafka和redis实现。


背景技术:

2.日志分析用于有效监控用户网络行为,跟踪网络资源的使用情况,识别异常流量和性能的瓶颈,以便更好的规划部署系统资源,响应故障告警,达到一个稳定、安全、高效的系统运营环境。
3.传统日志分析,需要对日志文本进行逐行解析,提取所需要字段,并进行统计分析,效率低下,且不能实时展示最新日志分析统计结果。
4.为此,开源的监控、告警系统prometheus,从2012开始被很多公司开始使用,然而,prometheus提供的exporter不能自定义指标进行收集,只能收集一些通用的指标,例如,机器cpu占用情况、进程占用内存等,具有一定的使用局限性。
5.有鉴于此,急需对现有的prometheus监控、告警系统进行改进,以改进现有prometheus的局限性,实现自定义指标收集日志信息,并展示自定义指标的图形化结果,方便运维人员进行管理。


技术实现要素:

6.针对上述缺陷,本发明所要解决的技术问题在于提供一种自定义prometheus收集日志信息指标的方法和系统,基于kafka和redis实现,以解决现有的prometheus监控、告警系统,不能自定义指标进行收集,且不能实时展示最新日志分析统计结果的问题。
7.为此,本发明提供的一种自定义prometheus收集日志信息指标的方法,包括以下步骤:
8.配置日志采集器的配置文件,设定所要收集的日志文件名称、位置以及输出组件;
9.搭建kafka集群,接收日志采集器推送的日志消息;
10.解析收到的日志消息,并将解析结果写入redis;
11.通过自定义prometheus exporter处理redis中的日志解析结果;
12.通过prometheus定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。
13.在上述方法中,优选地,解析日志消息中的日志内容,并将解析结果写入redis的方法如下:
14.kafka消费者解析日志消息中的日志内容,并根据日志关键字确定redis键以及redis值,其中redis键为日志关键字,redis值为日志关键字对应的关键字值;
15.将redis键和redis值采用redis集合数据类型写入redis保存,其中,每一个收集日志指标放进同一个redis集合中,采用唯一的redis键写入redis服务端。
16.在上述方法中,通过自定义的prometheus exporter处理redis中的日志解析结
果,包括以下步骤:
17.获取redis集合的全部元素;
18.遍历redis集合;
19.根据redis键确定prometheus使用的指标类型;
20.提取redis键及对应的元素值;
21.从redis集合删除该元素。
22.在上述方法中,优选地,采用filebeat日志采集器采集日志,并在filebeat.yml配置文件中通过配置multiline.negate:true和multiline.match:after,设置多行日志分隔的规则。
23.在上述方法中,优选地,kafka消费者采用kafka-python库与kafka集群的连接,采用redis库与redis连接,通过设置日志topic的partition数量与同一个组的kafka消费者数量一致,实现kafka消费者的负载均衡。
24.在上述方法中,优选地,采用python flask和prometheus-client客户端库,自定义prometheus exporter,向prometheus输出自定义收集日志指标。
25.在上述方法中,优选地,通过在prometheus配置定时器,定时从exporter提供的接口拉取收集日志指标。
26.本发明还提供了一种自定义prometheus收集日志信息指标的系统,包括:
27.日志采集器,用于通过配置日志采集器的配置文件,设定所要收集的日志文件名称、位置以及输出组件,并采集应用日志;
28.kafka集群,用于接收日志采集器推送的日志消息;
29.redis,用于将日志消息的解析结果写入redis;
30.prometheus exporter,用于处理redis中的日志解析结果,并自定义收集日志指标;
31.prometheus,定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。
32.在上述系统中,优选地,采用filebeat日志采集器采集日志,并在filebeat.yml配置文件中设置多行日志分隔的规则。
33.在上述系统中,优选地,kafka消费者采用kafka-python库与kafka集群的连接,采用redis库与redis连接,通过设置日志topic的partition数量与同一个组的kafka消费者数量一致,实现kafka消费者的负载均衡;
34.采用python flask和prometheus-client客户端库,自定义prometheus exporter,向prometheus输出自定义收集日志指标。
35.由上述技术方案可知,本发明提供的一种自定义prometheus收集日志信息指标的方法和系统,解决了现有prometheus不能自定义指标进行收集,且不能实时展示最新日志分析统计结果的问题。与现有技术相比,本发明具有以下有益效果:
36.通过kafka集群接收日志采集器推送的日志消息;解析日志消息中的日志内容,并将解析结果写入redis;通过自定义prometheus exporter向prometheus输出自定义的收集日志指标,通过prometheus定时由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。实现了自定义指标收集日志信息,并展示自定义指标的
图形化结果,方便运维人员进行管理。
附图说明
37.为了更清楚地说明本发明的实施例或现有技术中的技术方案,下面将对本发明实施例或现有技术描述中所需要使用的附图做出简单地介绍和说明。显而易见地,下面描述中的附图仅仅是本发明的部分实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
38.图1为本发明提供的一种自定义prometheus收集日志信息指标的方法流程图;
39.图2为本发明中kafka集群的示意图;
40.图3为本发明中grafana展示prometheus中收集的指标的示意图。
具体实施方式
41.下面将结合本发明实施例附图,对本发明实施例的技术方案进行清楚、完整地描述,显然,以下所描述的实施例,仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动的前提下,所获得的所有其他实施例,都属于本发明保护的范围。
42.本发明的实现原理是:通过kafka集群接收日志采集器推送的日志消息;解析日志消息中的日志内容,并将解析结果写入redis;通过自定义prometheus exporter处理redis中的日志解析结果,通过prometheus定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。实现了自定义指标收集日志信息,并展示自定义指标的图形化结果,方便运维人员进行管理。
43.为了对本发明的技术方案和实现方式做出更清楚地解释和说明,以下介绍实现本发明技术方案的几个优选的具体实施例。
44.需要说明的是,本文中“内、外”、“前、后”及“左、右”等方位词是以产品使用状态为基准对象进行的表述,显然,相应方位词的使用对本方案的保护范围并非构成限制。
45.请参见图1,图1为本发明提供的一种自定义prometheus收集日志信息指标的方法流程图。
46.如图1所示,本发明提供的一种自定义prometheus收集日志信息指标的方法,包括以下步骤:
47.步骤110,配置日志采集器的配置文件,设定所要监视的日志文件或位置以及输出组件。
48.本实施例采用的是filebeat日志采集器。filebeat是一个用于转发和集中日志数据的轻量级传送工具,通过配置filebeat.yml配置文件,设定所要收集的日志文件名称、位置,收集日志事件,并将收集到的日志文件通过日志消息推送给指定的输出组件,如:elasticsearch,logstash,kafka,redis,file,console,elasticcloud,changetheoutputcodec等。
49.filebeat.yml配置文件定义收集日志的一种示例如下:
50.filebeat.inputs:
[0051]-type:log
[0052]
enabled:true
[0053]
paths:
[0054]-/home/boper/ksb*/logs/ksb.txt
[0055]
multiline.pattern:^(debug|info|warn|error)
[0056]
multiline.negate:true
[0057]
multiline.match:after
[0058]
由于日志可能包含多行,filebeat.yml配置文件通过配置multiline.negate:true和multiline.match:after,设置多行日志分隔的规则。
[0059]
filebeat.yml配置文件定义将日志输出至kafka的一种示例如下:
[0060]
output.kafka:
[0061]
hosts:["10.88.102.13:9095","10.88.102.13:9096","10.88.102.13:9097"]
[0062]
topic:kafka_log
[0063]
partition.round_robin:
[0064]
reachable_only:true
[0065]
输出配置中,包括kafka集群地址"10.88.102.13:9095","10.88.102.13:9096","10.88.102.13:9097",kafka topic名称,filebeat作为kafka的生产者。
[0066]
步骤120,搭建kafka集群,接收日志采集器推送的日志消息。
[0067]
kafka是一种分布式、支持分区partition、基于zookeeper协调的发布/订阅消息系统,在kafka中,消息以主题topic来分类,每一个主题对应一个消息队列。broker是kafka实例,每个kafka服务器上有一个或多个kafka实例,它接受kafka生产者发送的消息并存入磁盘,同时服务kafka消费者拉取分区消息的请求,返回目前已经提交的消息。
[0068]
如图2所示的kafka集群,zookeeper集群用于对broker集群进行管理,broker集群用于实际存储topic数据。
[0069]
日志采集器filebeat作为kafka的生产者,生产日志消息。kafka集群接收到filebeat推送过来的日志消息后,kafka消费者通过订阅topic对日志消息进行消费。
[0070]
通过设置日志topic的partition数量与同一个组的kafka消费者数量一致,实现kafka消费者的负载均衡。
[0071]
步骤130,解析日志消息中的日志内容,并将解析结果写入redis。
[0072]
kafka消费者(kafka consumer)采用kafka-python库与kafka集群连接,采用redis库与redis连接。
[0073]
kafka consumer处理流程如下:
[0074]
kafka consumer接收到日志消息后,对日志消息中的日志内容进行解析,根据日志关键字确定redis键,该关键字的值作为redis值,将日志内容的解析结果(redis键和redis值)写入redis保存起来。
[0075]
保存时,采用redis集合数据类型,将每一个收集日志指标放进同一个redis集合中,采用唯一的redis键写入redis服务端。
[0076]
例如,日志:指令推送=》014指令推送end总耗时:7102毫秒。
[0077]
kafka consumer对日志内容进行解析,提取出关键字为指令推送总耗时,关键字的值为7102毫秒,采用redis_client.sadd(redis_key,redis_value)格式写入redis服务
端,即redis_client.sadd(ins_send_total,7102),其中redis_key为关键字指令推送总耗时的唯一的redis键ins_send_total。
[0078]
为了与其他处理过程的处理耗时区分开来,指令推送总耗时采用了唯一的redis键“ins_send_total”。
[0079]
步骤140,通过自定义的prometheus exporter处理redis中的日志解析结果,获得自定义日志收集指标。
[0080]
步骤140包括以下步骤:
[0081]
获取redis集合的全部元素;
[0082]
遍历redis集合;
[0083]
根据redis键确定prometheus使用的指标类型;
[0084]
提取redis键及对应的元素值;
[0085]
从redis集合删除该元素。。
[0086]
本实施例中,采用python flask和prometheus-client客户端库实现一个自定义的prometheus exporter。
[0087]
例如,统计指令推送总耗时。
[0088]
首先,在prometheus exporter定义指标类型。
[0089]
prometheus一共有四种指标类型:counter(计数器)、guage(仪表盘)、histogram(直方图)和summary(摘要)。本实施例以自带buckets区间用于统计分布的直方图histogram为例子说明。
[0090]
risk_registry=collectorregistry()
[0091]
buckets=(100,150,200,250,300,500,1000,3000,5000,10000,20000,30000,float("inf"))
[0092]
ins_send_total=histogram(name='ins_send_total',
[0093]
documentation='instruction send total latency',
[0094]
registry=risk_registry,
[0095]
buckets=buckets)
[0096]
histogram指标类型用于统计样本数据落在不同的桶(buckets)里面的数量,使用observe()方法增加一个样本值。
[0097]
上面的例子中,kafka consumer已将耗时结果保存至redis,保存结果示例:
[0098]
127.0.0.1:6380》smembers ins_send_total
[0099]
1)"7102.55"
[0100]
2)"8284.13"
[0101]
即指令推送总耗时保存了两个元素,分别为7102.55和8284.13。
[0102]
exporter提供了http/risk/metrics接口(接口由exporter路径决定),供prometheus定时调用。通过exporter的/risk/metrics接口,遍历保存在redis中的结果,例如上面已保存的ins_send_total集合键。
[0103]
对集合内的两个元素7102.55和8284.13,分别调用ins_send_total.observe(elapse_time),将样本值7102.55和8284.13写入至ins_send_total这个histogram的bucket中。
[0104]
处理完成后,将元素7102.55和8284.13从redis集合中删除,避免下次重复处理。
[0105]
通过访问exporter的/risk/metrics接口,可以得到histogram指标统计情况:
[0106]
#help ins_send_total instruction send total latency
[0107]
#type ins_send_total histogram
[0108]
ins_send_total_bucket{le="100.0"}0.0
[0109]
ins_send_total_bucket{le="150.0"}0.0
[0110]
ins_send_total_bucket{le="200.0"}0.0
[0111]
ins_send_total_bucket{le="250.0"}0.0
[0112]
ins_send_total_bucket{le="300.0"}0.0
[0113]
ins_send_total_bucket{le="500.0"}0.0
[0114]
ins_send_total_bucket{le="1000.0"}0.0
[0115]
ins_send_total_bucket{le="3000.0"}44.0
[0116]
ins_send_total_bucket{le="5000.0"}356.0
[0117]
ins_send_total_bucket{le="10000.0"}1981.0
[0118]
ins_send_total_bucket{le="20000.0"}2069.0
[0119]
ins_send_total_bucket{le="30000.0"}2073.0
[0120]
ins_send_total_bucket{le=" inf"}2078.0
[0121]
ins_send_total_count 2078.0
[0122]
ins_send_total_sum 1.4225596889700003e 07
[0123]
步骤150,prometheus定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。
[0124]
例如,prometheus配置定时从上述exporter提供的/risk/metrics接口拉取指标数据,示例如下:
[0125]
scrape_configs:
[0126]-job_name:risk-export
[0127]
scrape_interval:10s
[0128]
scrape_timeout:10s
[0129]
metrics_path:/risk/metrics
[0130]
static_configs:
[0131]-targets:
[0132]-10.88.102.13:5005
[0133]
表示prometheus从http://10.88.102.13:5005/risk/metrics接口拉取指标数据,scrape_interval配置调用接口的频率为每10秒一次。
[0134]
prometheus将调用接口拉取的指标数据保存至tsdb时序数据库中,可以供grafana展示使用。
[0135]
为了提升kafka consumer处理日志的效率,可以启动多个kafka consumer实例,实例数量与kafka topic的partition数量一致,实现负载均衡。
[0136]
grafana用于展示prometheus中收集的指标。在grafana配置好prometheus数据源后,接下来设置新的dashboard和panel,通过promsql查询prometheus的tsdb时序数据库得
到指标统计结果:
[0137]
例如,promsql:
[0138]
(rate(ins_send_total_sum[1m])/rate(ins_send_total_count[1m]))/1000
[0139]
展示结果如图3所示。
[0140]
在上述方法的基础上,本发明还提供了一种自定义prometheus收集日志信息指标的系统,包括:
[0141]
日志采集器,用于通过配置日志采集器的配置文件,设定所要收集的日志文件名称、位置以及输出组件,并采集应用日志;
[0142]
kafka集群,用于接收日志采集器推送的日志消息;
[0143]
redis,用于将日志消息的解析结果写入redis;
[0144]
prometheus exporter,用于处理redis中的日志解析结果,并自定义收集日志指标;
[0145]
prometheus,定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。
[0146]
kafka集群、redis以及prometheus的工作原理和过程已在上述方法中进行了充分介绍,在此不再赘述。
[0147]
综合以上具体实施例的描述,本发明提供的一种自定义prometheus收集日志信息指标的方法和系统,与现有技术相比,具有如下优点:
[0148]
第一,通过kafka集群接收日志采集器推送的日志消息;解析日志消息中的日志内容,并将解析结果写入redis;通过自定义prometheus exporter处理redis中的日志解析结果,通过prometheus定时收集由prometheus exporter定义的收集日志指标,并通过grafana图形化展示收集日志指标。实现了自定义指标收集日志信息,并展示自定义指标的图形化结果,方便运维人员进行管理。
[0149]
第二,通过设置日志topic的partition数量与同一个组的kafka消费者数量一致,实现kfka消费者的负载均衡。
[0150]
第三,在filebeat.yml配置文件中通过配置multiline.negate:true和multiline.match:after,设置多行日志分隔的规则,解决了多行日志的采集问题。
[0151]
最后,还需要说明的是,在本文中使用的术语"包括"、"包含"或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句"包括一个

"限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0152]
本发明并不局限于上述最佳实施方式,任何人应该得知在本发明的启示下做出的结构变化,凡是与本发明具有相同或相近的技术方案,均落入本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献