1

我正在使用 telegraf、influxdb 和 grafana 为分布式应用程序制作监控系统。我要做的第一件事是计算机器上运行的 java 进程的数量。

但是当我提出请求时,进程的数量几乎是随机的(总是在 1 到 8 之间,而不是总是有 8 个)。

我认为我的电报配置有错误,但我看不到在哪里.. 我试图改变interval但没有什么不同:似乎 influxdb 没有所有数据。

我正在运行 centos 7 和 Telegraf v1.5.0 (git: release-1.5 a1668bbf)

我要计算的所有 Java 进程:

[root@localhost ~]# pgrep -f java
10665
10688
10725
10730
11104
11174
16298
22138

我的电报.conf:

[global_tags]

# Configuration for telegraf agent
[agent]
  interval = "5s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  debug = true
  quiet = false
  logfile = "/var/log/telegraf/telegraf.log"
  hostname = "my_server"
  omit_hostname = false

我的 input.conf :

# Read metrics about disk usagee
[[inputs.disk]]
  fielddrop = [ "inodes*" ]
  mount_points=["/", "/workspace"]                                                                                                                                                                                                                                  

# File
[[inputs.filestat]]
  files = ["myfile.log"]

# Read the number of running java process
[[inputs.procstat]]
  user = "root"
  pattern = "java"

我的请求 :

要求

响应 :

回复

4

2 回答 2

2

如果您只想计算PID,这是一个很好的使用方法exec

[[inputs.exec]]
  commands = ["pgrep -c java"] #command to execute
  name_override = "the_name"   #database's name
  data_format = "my_value"     #colunm's name

对于commands,pgrep -c java不使用选项-f,因为它是“完整的”并且还计算命令pgrep(并且您遇到的问题与使用 procstat 几乎相同)。

在这里找到的解决方案

于 2018-02-12T16:18:25.360 回答
1

使用模式匹配,如果它匹配多个 pid,则生成具有相同标签和时间戳的多个数据点。当这些点被发送到 influxdb 时,只存储最后一个点。

您的配置可能发生的情况示例:

00:00 => pid 1
00:05 => pid 2
00:10 => pid 1
00:15 => pid 5
00:20 => pid 7
00:25 => pid 3
00:30 => pid 3
00:35 => pid 4
00:40 => pid 6
00:45 => pid 7
00:50 => pid 6
00:55 => pid 5
Different pids over one minute = 7 (pid 8 was not stored a single time)

由于它是随机的,因此您有时会在一分钟内点击 8 个不同的 pid,但大多数时候您不会。


要区分标签相同的进程,请使用pid_tag = true

[[inputs.procstat]]
  user = "root"
  pattern = "java"
  pid_tag = true

但是,如果您只想计算进程数(而不关心统计信息),只需使用带有自定义命令的execpgrep -c -f java插件,例如. 这将比拥有多个时间序列更优化(使用 pid_tag 最终每个 pid 一个)。

于 2018-02-09T13:14:58.390 回答