logstash monitor

logstash monitor

logstash 提供了四种api用于监控:

  • Node Info API
  • Plugins Info API
  • Node Stats API
  • Hot Threads API

在logstash启动后,我们可以通过访问9600端口,curl -XGET 'localhost:9600/?pretty',获取logstash的基本信息。

1
2
3
4
5
{
"host": "logstash.1",
"version": "5.6.16",
"http_address": "127.0.0.1:9600"
}

默认logstash启动时会绑定9600端口,如果要启动多个logstash实例,可以通过命令行参数--http.port,来修改绑定port。

node info

curl -XGET 'localhost:9600/_node/<types>'节点信息API检索有关节点的信息。<types>是可选的,指定要返回的节点信息的类型。

可以通过逗号分隔组合以下任何类型来限制返回的信息:

type desc
pipeline 获取特定于管道的信息和设置。
os 获取有关OS的节点级信息。
jvm 获取节点级JVM信息,包括有关线程的信息。

plugin info

curl -XGET 'localhost:9600/_node/plugins?pretty'插件信息API获取有关当前安装的所有Logstash插件的信息。此API基本上返回运行bin/logstash-plugin list –verbose命令的输出。

stats info

curl -XGET 'localhost:9600/_node/stats/<types>'获取logstash 运行时状态。<types>是可选的,有以下取值:

type desc
jvm 获取JVM统计信息,包括有关线程,内存使用情况,垃圾收集器和正常运行时间的统计信息。
process 获取进程统计信息,包括有关文件描述符,内存消耗和CPU使用率的统计信息。
pipeline 获取有关Logstash管道的运行时统计信息。
reloads 获取有关配置重新加载成功和失败的运行时统计信息。
os 当Logstash在容器中运行时,获取有关cgroup的运行时统计信息。

hot thread

curl -XGET 'localhost:9600/_node/hot_threads?pretty'热线程API获取Logstash的当前热线程。热线程是一个Java线程,它具有较高的CPU使用率并且执行时间超过正常时间。

一个热线程例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{
"time": "2017-01-12T12:09:45-08:00",
"busiest_threads": 3,
"threads": [
{
"name": "LogStash::Runner",
"percent_of_cpu_time": 1.07,
"state": "timed_waiting",
"traces": [
"java.lang.Object.wait(Native Method)",
"java.lang.Thread.join(Thread.java:1253)",
"org.jruby.internal.runtime.NativeThread.join(NativeThread.java:75)",
"org.jruby.RubyThread.join(RubyThread.java:697)",
"org.jruby.RubyThread$INVOKER$i$0$1$join.call(RubyThread$INVOKER$i$0$1$join.gen)",
"org.jruby.internal.runtime.methods.JavaMethod$JavaMethodN.call(JavaMethod.java:663)",
"org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:198)",
"org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:306)",
"org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:136)",
"org.jruby.ast.CallNoArgNode.interpret(CallNoArgNode.java:60)"
]
},
{
"name": "[main]>worker7",
"percent_of_cpu_time": 0.71,
"state": "waiting",
"traces": [
"sun.misc.Unsafe.park(Native Method)",
"java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)",
"java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)",
"org.jruby.RubyThread.lockInterruptibly(RubyThread.java:1470)",
"org.jruby.ext.thread.Mutex.lock(Mutex.java:91)",
"org.jruby.ext.thread.Mutex.synchronize(Mutex.java:147)",
"org.jruby.ext.thread.Mutex$INVOKER$i$0$0$synchronize.call(Mutex$INVOKER$i$0$0$synchronize.gen)"
]
},
{
"name": "[main]>worker3",
"percent_of_cpu_time": 0.71,
"state": "waiting",
"traces": [
"sun.misc.Unsafe.park(Native Method)",
"java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:897)",
"java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)",
"java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)",
"org.jruby.RubyThread.lockInterruptibly(RubyThread.java:1470)",
"org.jruby.ext.thread.Mutex.lock(Mutex.java:91)",
"org.jruby.ext.thread.Mutex.synchronize(Mutex.java:147)",
"org.jruby.ext.thread.Mutex$INVOKER$i$0$0$synchronize.call(Mutex$INVOKER$i$0$0$synchronize.gen)"
]
}
]
}
}
url参数 描述
threads 要返回的热线程数。默认值为3。
human 如果为true,则返回纯文本而不是JSON格式。默认值为false。
ignore_idle_threads 如果为true,则不返回空闲线程。默认值为true。

这四种api会返回实时结果,如果要持续监控,可以考虑使用 xpack的monior UI。

logging

除了使用实时的monitor rest api获取信息,我们还可以开启部分logger的debug/trace模式来收集更多信息。

curl -XGET 'localhost:9600/_node/logging?pretty'可以看到当前logstash的所有logger的level。

然后我们可以通过以下方式临时调整logger level:

1
2
3
4
5
curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
"logger.logstash.outputs.elasticsearch" : "DEBUG"
}
'

也可以在log4j2.properties文件中加上下面的配置,实现永久生效的配置:

1
2
logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug

再次调用curl -XGET 'localhost:9600/_node/logging?pretty'可以看到当前logstash的部分logger的level已经修改了。

-------------本文结束感谢您的阅读-------------
坚持分享,您的支持将鼓励我继续创作!
0%