夜莺初探四·mtail插件采集日志指标

这篇具有很好参考价值的文章主要介绍了夜莺初探四·mtail插件采集日志指标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

夜莺初探四·mtail插件采集日志指标

前言

上一篇介绍了Categraf的配置,这篇我们尝试通过使用google开源的mtail工具来作为Categraf的插件,从应用日志中提取指标数据。

mtail项目介绍和配置文件说明

通过mtail -h可以很方便看到参数详细,也推荐乔克-从日志中提取指标的瑞士军刀或者Dream运维梦工厂-categraf-mtail日志收集插件详解来了解更多,我就不再班门弄斧了。
当然也可以通过官方来了解详情新手村介绍 和高手入门

Categraf采集插件

categraf-mtail插件地址

https://github.com/flashcatcloud/categraf/tree/main/inputs/mtail

源码解读

package mtail
...

//常量值
const inputName = `mtail`
const description = ` extract internal monitoring data from application logs`

//配置
// MTail holds the configuration for the plugin.
type MTail struct {
    config.PluginConfig
    Instances []*Instance `toml:"instances"`
}
//配置文件中instances对象需要参数结构体
type Instance struct {
	config.InstanceConfig


	/**
		type InternalConfig struct {
			// append labels
			Labels map[string]string `toml:"labels"`

			// metrics drop and pass filter
			MetricsDrop       []string `toml:"metrics_drop"`
			MetricsPass       []string `toml:"metrics_pass"`
			MetricsDropFilter filter.Filter
			MetricsPassFilter filter.Filter

			// metric name prefix
			MetricsNamePrefix string `toml:"metrics_name_prefix"`

			// mapping value
			ProcessorEnum []*ProcessorEnum `toml:"processor_enum"`

			// whether instance initial success
			inited bool `toml:"-"`
		}
		type InstanceConfig struct {
			InternalConfig
			IntervalTimes int64 `toml:"interval_times"`
		}
	**/


	NamePrefix           string        `toml:"name_prefix"`
	Progs                string        `toml:"progs"` 							//规则文件(xxx.mtail)的目录
	Logs                 []string      `toml:"logs"` 							//要监控的日志文件
	IgnoreFileRegPattern string        `toml:"ignore_filename_regex_pattern"`
	OverrideTimeZone     string        `toml:"override_timezone"`				//指定时区
	EmitProgLabel        string        `toml:"emit_prog_label"`					//是否导出label标签 string类型的bool值 
	emitProgLabel        bool          `toml:"-"`
	EmitMetricTimestamp  string        `toml:"emit_metric_timestamp"`			//metrics是否带时间戳 string类型的bool值
	emitMetricTimestamp  bool          `toml:"-"`
	PollInterval         time.Duration `toml:"poll_interval"`
	PollLogInterval      time.Duration `toml:"poll_log_interval"`
	MetricPushInterval   time.Duration `toml:"metric_push_interval"`
	MaxRegexpLen         int           `toml:"max_regexp_length"`
	MaxRecursionDepth    int           `toml:"max_recursion_depth"`

	SyslogUseCurrentYear string `toml:"syslog_use_current_year"` // true
	sysLogUseCurrentYear bool   `toml:"-"`
	LogRuntimeErrors     string `toml:"vm_logs_runtime_errors"` // true
	logRuntimeErrors     bool   `toml:"-"`
	//
	ctx    context.Context    `toml:"-"`
	cancel context.CancelFunc `toml:"-"`
	m      *mtail.Server
}
//配置文件中instances对象的Init函数,调用mtail
func (ins *Instance) Init() error {

	//初始化检查,设置默认值

	if len(ins.Progs) == 0 || len(ins.Logs) == 0 {
		return types.ErrInstancesEmpty
	}

	// set default value
	ins.sysLogUseCurrentYear = ins.SyslogUseCurrentYear == "true"
	ins.logRuntimeErrors = ins.LogRuntimeErrors == "true"
	ins.emitProgLabel = ins.EmitProgLabel == "true"
	ins.emitMetricTimestamp = ins.EmitMetricTimestamp == "true"

	if ins.PollLogInterval == 0 {
		ins.PollLogInterval = 250 * time.Millisecond
	}
	if ins.PollInterval == 0 {
		ins.PollInterval = 250 * time.Millisecond
	}
	if ins.MetricPushInterval == 0 {
		ins.MetricPushInterval = 1 * time.Minute
	}
	if ins.MaxRegexpLen == 0 {
		ins.MaxRegexpLen = 1024
	}
	if ins.MaxRecursionDepth == 0 {
		ins.MaxRecursionDepth = 100
	}
	buildInfo := mtail.BuildInfo{
		Version: config.Version,
	}
	//时区设置
	loc, err := time.LoadLocation(ins.OverrideTimeZone)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Couldn't parse timezone %q: %s", ins.OverrideTimeZone, err)
		return err
	}
	//mtail参数设置
	opts := []mtail.Option{
		mtail.ProgramPath(ins.Progs),
		mtail.LogPathPatterns(ins.Logs...),
		mtail.IgnoreRegexPattern(ins.IgnoreFileRegPattern),
		mtail.SetBuildInfo(buildInfo),
		mtail.OverrideLocation(loc),
		mtail.MetricPushInterval(ins.MetricPushInterval), // keep it here ?
		mtail.MaxRegexpLength(ins.MaxRegexpLen),
		mtail.MaxRecursionDepth(ins.MaxRecursionDepth),
		mtail.LogRuntimeErrors,
	}
	if ins.cancel != nil {
		ins.cancel()
	} else {
		ins.ctx, ins.cancel = context.WithCancel(context.Background()) //父级ctx
	}
	//mtail配置,每隔1h启动 清理过期日志
	staleLogGcWaker := waker.NewTimed(ins.ctx, time.Hour)
	opts = append(opts, mtail.StaleLogGcWaker(staleLogGcWaker))

	if ins.PollInterval > 0 {
		logStreamPollWaker := waker.NewTimed(ins.ctx, ins.PollInterval)
		logPatternPollWaker := waker.NewTimed(ins.ctx, ins.PollLogInterval)
		opts = append(opts, mtail.LogPatternPollWaker(logPatternPollWaker), mtail.LogstreamPollWaker(logStreamPollWaker))
	}
	if ins.sysLogUseCurrentYear {
		opts = append(opts, mtail.SyslogUseCurrentYear)
	}
	if !ins.emitProgLabel {
		opts = append(opts, mtail.OmitProgLabel)
	}
	if ins.emitMetricTimestamp {
		opts = append(opts, mtail.EmitMetricTimestamp)
	}
	//指标结果存储对象
	store := metrics.NewStore()
	//间隔1h清理历史指标
	store.StartGcLoop(ins.ctx, time.Hour)

	m, err := mtail.New(ins.ctx, store, opts...)
	if err != nil {
		log.Println(err)
		ins.cancel()
		return err
	}
	ins.m = m

	return nil
}
//销毁取消所有任务
func (ins *Instance) Drop() {
	ins.cancel()
}
//对象初始化方法
func init() {
	inputs.Add(inputName, func() inputs.Input {
		return &MTail{}
	})
}
//对象复制返回新建对象
func (s *MTail) Clone() inputs.Input {
	return &MTail{}
}

func (s *MTail) Name() string {
	return inputName
}
//MTail获取配置文件中所有instances
func (s *MTail) GetInstances() []inputs.Instance {
	ret := make([]inputs.Instance, len(s.Instances))
	for i := 0; i < len(s.Instances); i++ {
		ret[i] = s.Instances[i]
	}
	return ret
}

// Description returns a one-sentence description on the input.
func (s *MTail) Description() string {
	return description
}
//抓取数据方法?
// Gather retrieves all the configured fields and tables.
// Any error encountered does not halt the process. The errors are accumulated
// and returned at the end.
// func (s *Instance) Gather(acc telegraf.Accumulator) error {
func (ins *Instance) Gather(slist *types.SampleList) {
	//获取到prometheus注册器
	reg := ins.m.GetRegistry()
	mfs, done, err := prometheus.ToTransactionalGatherer(reg).Gather()
	if err != nil {
		log.Println(err)
		return
	}
	defer done()
	//遍历所有指标向量?
	for _, mf := range mfs {
		metricName := mf.GetName()
		//遍历所有指标
		for _, m := range mf.Metric {
			//加入配置的Lables
			tags := util.MakeLabels(m, ins.GetLabels())
			//处理不同指标类型
			if mf.GetType() == dto.MetricType_SUMMARY {
				util.HandleSummary(inputName, m, tags, metricName, ins.GetLogMetricTime, slist)
			} else if mf.GetType() == dto.MetricType_HISTOGRAM {
				util.HandleHistogram(inputName, m, tags, metricName, ins.GetLogMetricTime, slist)
			} else {
				util.HandleGaugeCounter(inputName, m, tags, metricName, ins.GetLogMetricTime, slist)
			}
		}
	}
}
//返回时间戳
func (p *Instance) GetLogMetricTime(ts int64) time.Time {
	var tm time.Time
	if ts <= 0 || !p.emitMetricTimestamp {
		return tm
	}
	sec := ts / 1000
	ms := ts % 1000 * 1e6
	tm = time.Unix(sec, ms)
	return tm
}

整体理解下来,Categraf有效的通过统一的文件完成了多个目录,多个规则的日志采集,简化许多操作。

最后感谢看完,由于作者水平有限,使用很多工具并不熟悉,如有错误和遗漏欢迎指出,感谢谅解。
以上内容来源于官方推出的夜莺黄埔营的免费培训活动,加入 QQ 群查看直播视频,还可以在官方答疑站点获得更多支持 https://answer.flashcat.cloud/文章来源地址https://www.toymoban.com/news/detail-442171.html

到了这里,关于夜莺初探四·mtail插件采集日志指标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sentinel的资源数据指标是如何采集

    之前的 NodeSelectorSlot 和 ClusterBuilderSlot 已经完成了对资源调用树的构建, 现在则是要对资源进行收集, 核心点就是 这些资源数据是如何统计 作用: 记录异常请求日志, 用于故障排查 LogSlot只做了一件事, 当出现 BlockException 异常时, 记录log日志( EagleEyeLogUtil.log 会将日志写到 sentin

    2024年02月21日
    浏览(34)
  • MySQL性能监控全掌握,快来get关键指标及采集方法!

    数据库中间件监控实战,MySQL中哪些指标比较关键以及如何采集这些指标了。帮助提早发现问题,提升数据库可用性。 监控哪类指标? 如何采集数据? 第10讲监控方法论如何落地? 这些就可以在MySQL中应用起来。MySQL是个服务,所以可借用Google四个黄金指标解决问题: 1.1 延

    2024年02月02日
    浏览(44)
  • ChatGPT科研阅读论文应用插件(txyz.ai)使用初探

            ChatGPT没有办法直接阅读论文,但使用txyz.ai插件可以使用ChatGPT来帮助快速得到论文中想要的信息,特别是对于专业名词较多的文章,而且可以问它关于这篇文章的问题,能够加快研究的进程。刚开始了解到这个应用是一个ChatGPT插件,需要在GPT模型中安装,对于国内

    2024年02月10日
    浏览(60)
  • Spring Boot指标监控及日志管理

    目录 一、添加Actuator功能 二、SpringBoot指标监控 Spring Boot Admin 1. 创建Spring Boot Admin服务端项目 2. 连接Spring Boot Admin项目 三、SpringBoot日志管理 Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用,比如健康检查、内存使用情况统计、线程使用情况统计等。我们在SpringBoot项目

    2024年02月06日
    浏览(39)
  • 1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

    数据仓库( Data Warehouse ),是为企业制定决策,提供数据支持的。可以帮助企业,改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括:业务数据、用户行为数据和爬虫数据等。 业务数据:就是各行业在处理事务过程中产生的数据。比如用户在电商网站中登录、

    2024年02月12日
    浏览(45)
  • Nginx 日志采集与分析

    观测云拥有全面的日志采集能力,包括系统日志、应用日志、安全日志等多种日志类型,通过观测云提供的自定义日志采集器可采集任意日志汇总到观测云进行统一存储和分析;通过观测云提供的文本处理器(Pipeline)可对采集的日志进行自定义切割,并把切割出来的字段作

    2024年02月13日
    浏览(47)
  • ELK 日志采集使用

    Docker 最新版Version 20.10安装_docker最新版本是多少_猿小飞的博客-CSDN博客 安装docker compose_猿小飞的博客-CSDN博客 1.3.1.编写 docker-compose.yml 脚本启动 ELK 服务 忘记了文件在哪里,可以使用下面命令进行查找    1.3.2.创建对应容器挂载目录 针对微服务,我们不同的服务,会专门设置

    2024年02月08日
    浏览(48)
  • loki采集docker日志

    说明 本文通过安装 docker loki plugin 直接采集docker容器日志,并推送至loki。官方文档 插件安装 插件升级 插件卸载 使用 单独为一个容器设置日志驱动 为所有的容器设置默认参数 编辑 /etc/docker/daemon.json 文件(如果没有就新建). 更多如 docker-compose 的用法参考官网文档.

    2024年02月15日
    浏览(32)
  • logstash 采集 docker 日志

    1、nginx容器部署 参考:nginx容器部署 将容器内的nginx日志文件映射到宿主机/home/logs/nginx目录下 注意:并且需要需要将日志的输出格式修改为json  2、编辑vim /opt/logstash-7.4.2/config/nginx-log-es.conf 文件,收集docker nginx容器日志 input{  file{    path = \\\"/home/logs/nginx/access.log\\\"    start_p

    2024年02月13日
    浏览(37)
  • 开源日志监控采集平台ELKF

    ---------------------- Filebeat+ELK 部署 ---------------------- Node1节点(2C/4G):node1/192.168.179.20                    Elasticsearch Node2节点(2C/4G):node2/192.168.179.23                    Elasticsearch Apache节点:apache/192.168.179.25                        Logstash  Kibana  Apache F

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包