暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

telegraf 监控配置

老柴杂货铺 2021-12-13
4760

一、连通性(inputs.ping)

[[inputs.ping]]
urls = ["10.168.1.1", "10.147.4.193"]
method = "native"
deadline = 2

field部分,有个result_code,如果是0表示正常,非0表示异常,可以拿这个字段做告警策略

如果ping监控需要探测的目标比较多,会占用很多网络连接的句柄,需要调大ulimit限制,建议把Telegraf用systemd托管,在systemd里可以调整这个配置:

[Service]
LimitNOFILE=8192

最终进程的限制,查看/proc/pid/limits

如果method是native,Telegraf这个进程本身就会直接发送icmp包,在大多数系统上,需要进程具备CAP_NET_RAW的能力,可以在systemd的配置中增加如下内容:

[Service]
CapabilityBoundingSet=CAP_NET_RAW
AmbientCapabilities=CAP_NET_RAW

二、端口

[[inputs.net_response]]
protocol = "tcp"
address = "192.168.10.70:10090"
timeout = "5s"
fielddrop = ["result_type", "string_found"]
tagexclude = ["result"]
tags = {bu="cloud", region="bj"}




[[inputs.net_response]]
protocol = "tcp"
address = "localhost:18000"
timeout = "1s"
fielddrop = ["result_type", "string_found"]
tagexclude = ["result"]
tags = {bu="cloud", region="local"}

result_code,只要这个值是0就是正常的,非0就是异常的


三、进程(inputs.ping)


[[inputs.procstat]]
pattern = "ibex server"
# pid_file = "/var/run/nginx.pid"
# exe = "nginx"
# user = "nginx"
# systemd_unit = "nginx.service"
# cgroup = "systemd/system.slice/nginx.service"




pid_finder = "pgrep"
tagexclude = ["result"]




[[inputs.procstat]]
pattern = "ibex agentd"
pid_finder = "pgrep"
tagexclude = ["result"]

procstat这个measurement是进程资源相关的,procstat_lookup这个measurement是进程数量相关的

注意一下rlimit_num_fds_soft这个field,这个字段建议配置告警,因为可能会有很多机器忘记调整ulimit配置了,或者调整的不对,导致有些进程的真实fd限制仍然是1024,有了这个监控指标,我们就可以方便的知道哪些进程有问题了


四、日志

1.telegraf自带的inputs.tail

[[inputs.tail]]
files=["/home/rocketai/tools/MyPerf4J/log/gc_metrics.log"]
from_beginning = false
pipe = false
watch_method = "inotify"
data_format = "influx"
name_suffix = "_myMetrics"

使用管道:

mkfifo pipeName

ssh -q username@serverA tail -f "pathToFile"/out.log > pipeName


2.telegrar自带的inputs.logparser

参考 logstash文档:

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

Telegraf 解析器使用经过稍微修改的 logstash “grok” 模式版本,其格式为


%{<capture_syntax>[:<semantic_name>][:<modifier>]}


capture_syntax :定义解析输入行的 grok 模式

semantic_name:用于命名字段或标记

modifier:扩展被解析项转换为的数据类型或其他特殊处理

默认情况下,所有命名的捕获都转换为字符串字段。如果模式没有语义名称,则不会捕获它。时间戳修饰符可用于将捕获转换为已解析度量的时间戳。如果未解析任何时间戳,则将使用当前时间创建度量。

自定义时间格式必须在引号内,并且必须是 “参考时间” 的表示形式 on Jan 2 15:04:05 -0700 MST 2006。

要匹配逗号小数点,可以使用句点。例如,%{TIMESTAMP:timestamp:ts-"2006-01-02 15:04:05.000"} 可以用来匹配 "2018-01-02 15:04:05,000" 要匹配逗号小数点,可以在模式字符串中使用句点。

有关更多详细信息,请参考:https://golang.org/pkg/time/#Parse

Telegraf 具有许多自己的内置模式,并支持大多数 logstash 的内置模式。 Golang 正则表达式不支持向前或向后查找。不支持依赖于这些的logstash 模式。

如果需要构建模式以匹配日志的调试,使用 https://grokdebug.herokuapp.com 调试非常有用!


[[inputs.logparser]]
#解决了当前目录多文件对象匹配的需求
files = ["C:\\Release\\TestConfigLog\\*.log"]
from_beginning = false
#设置轮训获取文件更新
watch_method = "poll"
[inputs.logparser.grok]
patterns = ['%{WORD:scene},%{NUMBER:version:float},%{TS_WIN:begtime},%{TS_WIN:endtime},%{WORD:canvasName},%{WORD:canvasCase},%{NUMBER:totaltimes:int},%{NUMBER:current:int},%{NUMBER:time_consuming:float}']
measurement = "bigscreen"
#自定义一个时间格式化模式匹配
custom_patterns = 'TS_WIN %{YEAR}/%{MONTHNUM}/%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?'
timezone = "Local"

3.使用mtail

下载地址:https://github.com/google/mtail/releases

使用方法:

##程序启动后默认监听3903端口,可以通过telegraf的pipe管道来监听http://ip:3903访问,metrics可以通过http://ip:3903/metrics访问
nohup mtail -logtostderr -progs /root/test.mtail -logs /home/ubuntu/video_server_for_ai/media_server.log &

参数详解

参数  描述
-address 绑定HTTP监听器的主机或IP地址
-alsologtostderr 记录标准错误和文件
-block_profile_rate 报告goroutine阻塞事件之前的纳秒时间
-collectd_prefix 发送给collectd的指标的metrics前缀
-collectd_socketpath collectd unixsock路径,用于向其写入metrics
-compile_only 仅尝试编译mtail脚本程序,不执行,用于测试脚本
-disable_fsnotify 是否禁用文件动态发现机制。为true时,不会监听动态加载发现的新文件,只会监听程序启动时的文件。
-dump_ast 解析后dump程序的AST(默认到/tmp/mtail.INFO)
-dump_ast_types 在类型检查之后dump带有类型注释的程序的AST(默认到/tmp/mtail.INFO)
-dump_bytecode dump程序字节码
-emit_metric_timestamp 发出metric的记录时间戳。如果禁用(默认设置),则不会向收集器发送显式时间戳。
-emit_prog_label 在导出的变量里面展示’prog’对应的标签。默认为true
-expired_metrics_gc_interval metric的垃圾收集器运行间隔(默认为1h0m0s)
-graphite_host_port graphite carbon服务器地址,格式Host:port。用于向graphite carbon服务器写入metrics
-graphite_prefix 发送给graphite指标的metrics前缀
-ignore_filename_regex_pattern 需要忽略的日志文件名字,支持正则表达式。使用场景:当-logs参数指定的为一个目录时,可以使用ignore_filename_regex_pattern 参数来忽略一部分文件
-jaeger_endpoint 如果设为true,可以将跟踪导出到Jaeger跟踪收集器。使用–jaeger_endpoint标志指定Jaeger端点URL
-log_backtrace_at 当日志记录命中设置的行N时,发出堆栈跟踪
-log_dir mtail程序的日志文件的目录,与logtostderr作用类似,如果同时配置了logtostderr参数,则log_dir参数无效
-logs 监控的日志文件列表,可以使用,分隔多个文件,也可以多次使用-logs参数,也可以指定一个文件目录,支持通配符*,指定文件目录时需要对目录使用单引号。如:
-logs a.log,b.log,c.log
-logs a.log -logs b.log -logs c.log
-logs ‘/export/logs/*.log’
-logtostderr 直接输出标准错误信息,编译问题也直接输出
-metric_push_interval_seconds metric推送时间间隔,单位:秒,默认60秒
-metric_push_write_deadline 在出现错误退出之前等待推送成功的时间。(默认10s)
-mtailDebug 设置解析器debug级别
-mutex_profile_fraction 报告的互斥锁争用事件的分数。0关闭。(此参数为直译,不太理解啥意思)
-one_shot 此参数将编译并运行mtail程序,然后从指定的文件开头开始读取日志(从头开始读取日志,不是实时tail),然后将收集的所有metrics打印到日志中。此参数用于验证mtail程序是否有预期输出,不用于生产环境。
-override_timezone 设置时区,如果使用此参数,将在时间戳转换中使用指定的时区来替代UTC
-poll_interval 设置轮询所有日志文件以获取数据的间隔;必须为正,如果为零将禁用轮询。使用轮询模式,将仅轮询在mtail启动时找到的文件
-port 监听的http端口,默认3903
-progs mtail脚本程序所在路径
-stale_log_gc_interval stale的垃圾收集器运行间隔(默认为1h0m0s)
-statsd_hostport statsd地址,格式Host:port。用于向statsd写入metrics
-statsd_prefix 发送给statsd指标的metrics前缀
-stderrthreshold 严重性级别达到阈值以上的日志信息除了写入日志文件以外,还要输出到stderr。各严重性级别对应的数值:INFO—0,WARNING—1,ERROR—2,FATAL—3,默认值为2.
-syslog_use_current_year 如果时间戳没有年份,则用当前年替代。(默认为true)
-trace_sample_period 用于设置跟踪的采样频率和发送到收集器的频率。将其设置为100,则100条收集一条追踪。
-v v日志的日志级别,该设置可能被 vmodule标志给覆盖.默认为0.
-version 打印mtail版本
-vmodule 按文件或模块来设置日志级别,如:-vmodule=mapreduce=2,file=1,gfs*=3

mtail脚本标准格式

标准格式为:

COND {
ACTION
}

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

/foo/ {
ACTION1
}


variable > 0 {
ACTION2
}


/foo/ && variable > 0 {
ACTION3
}

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

关系运算符:

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

算术运算符:

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

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

= , += , ++ , –


mtail的目的是从日志中提取信息并将其传递到监控系统。因此,必须导出指标变量并命名,命名可以使用counter、、gauge等指标类型,并且命名的变量必须在COND脚本之前。

如,导出一个counter类型的指标lines_total:统计日志行数,脚本内容如下:

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

mtail 支持将直方图作为第一类度量标准,使用桶(bucket)范围列表创建histogram,如下:


histogram foo buckets 1, 2, 4, 8

以上脚本创建了一个新的直方图foo,其桶的范围为[0-1),[1-2),[2-4),[4-8),[8, +∞)。

注意:0-1和8-无穷大是自动创建的。


如下一个例子,展示使用Histogram 统计服务器延迟情况:


日志格式如下:

GET /foo/bar.html latency=1s httpcode=200 
GET /foo/bar.html latency=2s httpcode=200
GET /foo/bar.html latency=1s httpcode=200
GET /foo/baz.html latency=0s httpcode=200

mtail脚本如下:

histogram webserver_latency buckets 0, 1, 2, 4, 8
/latency=(?P<latency>\d+)/ {
webserver_latency = $latency
}

统计到的指标如下:

webserver_latency_by_code_bucket{httpcode="200",prog="software_errors.mtail",le="1"} 1
webserver_latency_by_code_bucket{httpcode="200",prog="software_errors.mtail",le="2"} 1
webserver_latency_by_code_bucket{httpcode="200",prog="software_errors.mtail",le="4"} 1
webserver_latency_by_code_bucket{httpcode="200",prog="software_errors.mtail",le="8"} 1
webserver_latency_by_code_bucket{httpcode="200",prog="software_errors.mtail",le="+Inf"} 1
webserver_latency_by_code_sum{httpcode="200",prog="software_errors.mtail"} 1
webserver_latency_by_code_count{httpcode="200",prog="software_errors.mtail"} 2

更改导出metrics的变量名称

像sql中给字段起别名一样,此处放在定义变量的地方,如下:


counter lines_total as "lines-total"

可复用常量

如匹配ip等,可能会有多个地方调用的,可以配置成常量,如下:


const IP /\d+(\.\d+){3}/
const MATCH_IP /(?P<ip>/ + IP + /)/




...




# Duplicate lease
/uid lease / + MATCH_IP + / for client .* is duplicate on / {
duplicate_lease++
}

与标准正则一样,小括号()内的内容可以使用$1,$2等方式获取到,mtail脚本中此处MATCH_IP 中使用的?P<ip>则用来代替$1,$2等,可以直接使用$ip来获取匹配到的内容.


解析日志行时间戳

如果解析日志行中的时间戳,是为了导出变量使用,那么建议直接使用正则匹配到相应格式的时间戳,通过别名返回。

如果解析日志行中的时间戳是为了记录当前时间戳并且后续使用,那么就可以通过strptime(x,y)函数来解析日志中的时间戳,但是这个函数对日志时间戳格式有要求,可参考本文“内置函数”章节中的strptime()函数。

如,统计日志中时间格式包含“2006-01-02 15:04:05”格式类型的请求总数,脚本如下:

counter request_total
/(?P<date>\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*/ {
strptime($date, "2006-01-02 15:04:05")
request_total++
}

通用时间戳解析

可复用常量解决了表达式中重复使用子表达式的问题,而通用时间戳解析则是为了解决,多个变量之中重复解析设置时间戳的问题。


定义的格式如下:

def syslog {
/(?P<date>\w+\s+\d+\s+\d+:\d+:\d+)/ {
strptime($date, "Jan 2 15:04:05")
next
}
}

使用def关键字定义名称,使用大括号块定义内容,使用next关键字,跳转到导出变量的代码块执行。


使用的格式如下:

@syslog {
/some event/ {
variable++
}
}

@syslog表示该块首先由syslog装饰器执行,先提取日志的时间戳,然后使用next跳转到

“/some event/”块内执行。

例:


def syslog {
/(?P<date>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*/ {
strptime($date, "2006-01-02 15:04:05")
next
}
}
gauge sumVal




@syslog {




/-------(?P<val>\d)+--------/ {
sumVal+=$val
}
}

条件判断

通常情况下,当条件表达式不匹配时,会直接跳过。而通过else关键字可实现表达式不匹配时执行其他的动作。而通过otherwise关键字则可以实现像java中的switch一样的多条件判断的功能,如下:


#如果foo不匹配,则执行ACTION2
/foo/ {
ACTION1
} else {
ACTION2
}




/foo/ {
#当匹配foo时,才会进行foo1、foo2、otherwise的比配
#当匹配foo1时,执行ACTION1,匹配foo2时执行ACTION2,否则执行ACTION3
/foo1/ {
ACTION1
}
/foo2/ {
ACTION2
}
otherwise {
ACTION3
}
}


临时变量

临时变量就是只在mtail脚本程序中使用,不导出为metrics指标的变量。通过在gauge定义时前面加上hidden关键字来定义。临时变量使用完后,需要使用del关键字来删除临时变量控制内存。


hidden gauge connection_time by pid
gauge connection_time_total by pid
...




# 记录连接开始时间
/connect from \S+ \(\d+\.\d+\.\d+\.\d+\)/ {
# 此处记录开始时间,需要先使用strptime或者settime函数设置时间戳,timestamp才能正常执行
connection_time[$pid] = timestamp()
}




...




# 记录连接关闭时间
/sent (?P<sent>\d+) bytes received (?P<received>\d+) bytes total size \d+/ {
# 记录总时间
connection_time_total[$pid] += timestamp() - connection_time[$pid]




# 删除中间变量,控制内存
del connection_time[$pid]
}

此示例中,连接时间戳记录在临时变量connection_time中,并且connection_time通过pid来区分不同的链接.在链接结束时,通过当前时间戳-开始时间戳来计算增量,并且删除临时变量connection_time。


内置函数

函数  描述
timestamp() 获取时间戳。
注:需要使用strptime或者settime函数设置时间戳之后才能使用timestamp函数
strptime($date, “2006-01-02 15:04:05”) 第一个参数为日志中解析的时间格式,第二个参数为格式模板,此函数作用为使用第二个参数的格式来解析日志中的时间戳,并设置当前时间戳,将变量导出至上游收集器时使用此时间戳。
注:如果第二个参数格式不对,则编译抛出异常;如果日志解析出的时间格式不匹配,则抛出运行时异常。第二个参数必须使用这个特定的时间:2006-01-02 15:04:05。若需要其他格式,可参考Go的时间.parse()格式字符串中的const 部分下的ANSIC等格式。
len(str) 获取字符串长度
getfilename() 获取文件名
tolower(x) 字符串转小写
int(x) 将x转换为整数,如果x的类型支持转为整型,则转为整型;如果x的类型不支持转为整型,则触发编译错误;如果x的值不支持转为整型,则触发运行时错误。
float(x) 将x转换为浮点数,规则同int(x)
string(x) 将x转为字符串
strtol(x, y) 使用base将字符串x转为整数y。用于转换日志消息中的八进制、十六进制值
settime(x) x为整型,用于设置当前时间戳,将变量导出至上游收集器时使用此时间戳

示例

mtail读取多个文件时,按照文件名输出metrics

此场景针对监听目录,或者多个文件的情况,需要使用到内置函数getfilename(),脚本如下:


counter request_total by filename




/-------(?P<val>\d)+--------/ {
request_total[getfilename()]+=$val
}


文章转载自老柴杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论