首页 文章

使用Telegraf计算正在运行的进程数

提问于
浏览
1

我正在使用telegraf,Influxdb和grafana来为分布式应用程序创建一个监控系统 . 我想做的第一件事就是计算机器上运行的java进程数 .

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

我认为我的telegraf配置有一个错误,但我没有看到...我试图改变 interval 但没有什么不同:似乎涌入没有所有的数据 .

我正在运行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

我的telegraf.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"

我的请求 :

request

响应 :

response

2 回答

  • 1

    如果你只想计算PID,这是一个使用_227609这样的好方法:

    [[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 ,因为它是"full"并且还会对命令 pgrep 进行计数(并且您遇到的问题与使用procstat时几乎相同) .

    找到解决方案here

  • 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
    

    但是,如果您只想计算进程数(并且不关心统计信息),只需将exec插件与 pgrep -c -f java 等自定义命令一起使用即可 . 这将比具有倍数时间序列(pid_tag最终为每个pid一个)更加优化 .

相关问题