【问题标题】:Count the number of running process with Telegraf使用 Telegraf 计算正在运行的进程数
【发布时间】:2018-02-09 09:41:08
【问题描述】:

我正在使用 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"

我的要求:

回应:

【问题讨论】:

  • 我用exeprocess_name 代替pattern 进行了测试,我得到了相同的随机结果。

标签: monitoring influxdb grafana telegraf procstat


【解决方案1】:

如果你只是想计算 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,请使用不带选项-fpgrep -c java,因为它是“已满”的,并且还计算命令pgrep(您遇到的问题与使用procstat 几乎相同)。

找到解决方案here

【讨论】:

    【解决方案2】:

    通过模式匹配,如果它匹配多个 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
    

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

    【讨论】:

    • 我尝试了您的解决方案。我没有设法运行 pid_tag = true 的那个。但是第二种解决方案几乎可以工作。但有时我有正确的进程号,有时我有正确的进程号 + 1。它可能来自 pgrep 但我不知道如何修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多