Prometheus Telegraf連携

スポンサーリンク

Prometheusは大量コンポーネントを監視する事に特化したソフトウェアです。Prometheus単体で使用せず、いくつかのソフトウェアを組み合わせて監視の運用を実現する構成を採用する事もあります。このページではInfluxData社が開発したtelegrafと呼ばれるデータ収集・集計・転送ツールと連携する方法を説明します。

前提

参照資料

動作確認済環境

  • Rocky Linux 8.6
  • Prometheus 2.36.2
  • telegraf 1.23.2

telegraf側の構成

インストール

InfluxData download page」より最新バージョンのTelegrafのダウンロード方法を確認します。執筆時点(2022年7月)の最新の手順は以下の通りです。

Telegrafのダウンロード

2022/7/16時点の公式の手順をよく見るとリポジトリのURLに誤りがある事が分かりますので、以下のように適宜の修正をして操作します。修正部分は以下ハイライトした4行目です。

cat <<EOF | sudo tee /etc/yum.repos.d/influxdata.repo
[influxdata]
name = InfluxData Repository - Stable
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

sudo yum install telegraf

telegrafを起動します。

systemctl enable telegraf.service --now

サンプル設定の生成

Telegrafは以下のようなプラグインで構成されます。

  • Input plugins
  • Output plugins
  • Aggregator plugins
  • Processor plugins
  • External plugins

今回はTelegrafとPrometheusの連携を動作確認しますので、単純なInputプラグインとOutputプラグインを組み合わせてみましょう。

telegrafコマンドに引数output-listを与えると、使用可能なOutputプラグイン一覧が表示されます。Prometheusと連携させることもできます。

[root@linux010 ~]# telegraf --output-list
Available Output Plugins: 

  <omitted>

  opentelemetry
  opentsdb
  prometheus_client
  riemann
  riemann_legacy
  sensu
  signalfx

  <omitted>

telegrafコマンドに引数output-listを与えると、使用可能なInputプラグイン一覧が表示されます。

[root@linux010 ~]# telegraf --input-list
Available Input Plugins:
  KNXListener
  activemq
  aerospike
  aliyuncms
  amd_rocm_smi
  amqp_consumer
  apache

  <omitted>

telegrafコマンドは引数sample-configを与えると、サンプル設定が標準出力されます。input-fileterとoutput-filterは、それぞれInputプラグインとOutputプラグインの指定です。プラグインを複数指定する場合はコロン(:)で区切ります。

telegraf --sample-config \
  --input-filter diskio:cpu:mem \
  --output-filter prometheus_client

動作確認

生成されるサンプル設定を観察します。「OUTPUT PLUGINS」以下の設定を観察すると、tcp9273にInputプラグインで収集した結果が出力される事が分かります。

[root@linux040 ~]# telegraf --sample-config \
>   --input-filter diskio:cpu:mem \
>   --output-filter prometheus_client

  <omitted>

###############################################################################
#                            OUTPUT PLUGINS                                   #
###############################################################################


# Configuration for the Prometheus client to spawn
[[outputs.prometheus_client]]
  ## Address to listen on
  listen = ":9273"

  <omitted>

サンプル設定を/etc/telegraf/telegraf.confに書き込みます。

telegraf --sample-config \
  --input-filter diskio:cpu:mem \
  --output-filter prometheus_client \
  > /etc/telegraf/telegraf.conf 

設定反映のため、telegrafを再起動します。

systemctl restart telegraf.service 

「http://<IPアドレス>:9273/metrics」にて、Prometheusが読み込める形式でメトリックが表示されている事を確認します。

[root@linux010 ~]# curl -s http://localhost:9273/metrics | head -n 20
# HELP cpu_usage_guest Telegraf collected metric
# TYPE cpu_usage_guest gauge
cpu_usage_guest{cpu="cpu-total",host="linux010.gokatei.go"} 0
cpu_usage_guest{cpu="cpu0",host="linux010.gokatei.go"} 0
cpu_usage_guest{cpu="cpu1",host="linux010.gokatei.go"} 0
# HELP cpu_usage_guest_nice Telegraf collected metric
# TYPE cpu_usage_guest_nice gauge
cpu_usage_guest_nice{cpu="cpu-total",host="linux010.gokatei.go"} 0
cpu_usage_guest_nice{cpu="cpu0",host="linux010.gokatei.go"} 0
cpu_usage_guest_nice{cpu="cpu1",host="linux010.gokatei.go"} 0
# HELP cpu_usage_idle Telegraf collected metric
# TYPE cpu_usage_idle gauge
cpu_usage_idle{cpu="cpu-total",host="linux010.gokatei.go"} 87.70697441043734
cpu_usage_idle{cpu="cpu0",host="linux010.gokatei.go"} 97.18592964823921
cpu_usage_idle{cpu="cpu1",host="linux010.gokatei.go"} 78.07807807807755
# HELP cpu_usage_iowait Telegraf collected metric
# TYPE cpu_usage_iowait gauge
cpu_usage_iowait{cpu="cpu-total",host="linux010.gokatei.go"} 0
cpu_usage_iowait{cpu="cpu0",host="linux010.gokatei.go"} 0
cpu_usage_iowait{cpu="cpu1",host="linux010.gokatei.go"} 0.10010010010010677

Prometheus側の構成

Telegrafの出力結果をstatic_configsで指定すると、PrometheusとTelegrafを連携できます。Prometheus.ymlの設定例は以下の通りです。

scrape_configs:
  - job_name: telegraf
    static_configs:
      - targets:
        - localhost:9273

「http://<IPアドレス>:9090/targes」にて「up」と表示される事を確認します。「up」と表示されるという事は、PrometheusがTelegrafを問題なくスクレイプできている事を示します。

telegrafの動作確認

補足

snmpgetによるネットワーク機器の監視

telegrafはデータの収集・集計・転送ツールを得意とするツールです。ですので、Prometheusでは適当なプラグインがない場合は、telegrafを使ってデータを収集し、収集結果をprometheusに転送するような構成も採用できます。

まずは以下のようなコマンドを実行し、snmpに関するサンプルconfigを見てみます。

telegraf --sample-config \
  --input-filter snmp

不要なコメントなどが多いので必要な部分のみ抜粋すると以下のような設定になります。デフォルト設定から変更しなければならない最小限の設定はagentsとcommunityのみです。

cat << EOF > /etc/telegraf/telegraf.d/inputs.snmp.conf
###############################################################################
#                            INPUT PLUGINS                                    #
###############################################################################


# Retrieves SNMP values from remote agents
[[inputs.snmp]]
  ## Agent addresses to retrieve values from.
  ##   format:  agents = ["<scheme://><hostname>:<port>"]
  ##   scheme:  optional, either udp, udp4, udp6, tcp, tcp4, tcp6.
  ##            default is udp
  ##   port:    optional
  ##   example: agents = ["udp://127.0.0.1:161"]
  ##            agents = ["tcp://127.0.0.1:161"]
  ##            agents = ["udp4://v4only-snmp-agent"]
  agents = ["udp://192.168.69.1:161"]

  ## Timeout for each request.
  # timeout = "5s"

  ## SNMP version; can be 1, 2, or 3.
  # version = 2

  ## Unconnected UDP socket
  ## When true, SNMP reponses are accepted from any address not just
  ## the requested address. This can be useful when gathering from
  ## redundant/failover systems.
  # unconnected_udp_socket = false

  ## Path to mib files
  ## Used by the gosmi translator.
  ## To add paths when translating with netsnmp, use the MIBDIRS environment variable
  # path = ["/usr/share/snmp/mibs"]

  ## SNMP community string.
  community = "public"

  ## Agent host tag
  # agent_host_tag = "agent_host"

  ## Number of retries to attempt.
  # retries = 3

  ## The GETBULK max-repetitions parameter.
  # max_repetitions = 10

  ## SNMPv3 authentication and encryption options.
  ##
  ## Security Name.
  # sec_name = "myuser"
  ## Authentication protocol; one of "MD5", "SHA", "SHA224", "SHA256", "SHA384", "SHA512" or "".
  # auth_protocol = "MD5"
  ## Authentication password.
  # auth_password = "pass"
  ## Security Level; one of "noAuthNoPriv", "authNoPriv", or "authPriv".
  # sec_level = "authNoPriv"
  ## Context Name.
  # context_name = ""
  ## Privacy protocol used for encrypted messages; one of "DES", "AES", "AES192", "AES192C", "AES256", "AES256C", or "".
  ### Protocols "AES192", "AES192", "AES256", and "AES256C" require the underlying net-snmp tools
  ### to be compiled with --enable-blumenthal-aes (http://www.net-snmp.org/docs/INSTALL.html)
  # priv_protocol = ""
  ## Privacy password used for encrypted messages.
  # priv_password = ""

  ## Add fields and tables defining the variables you wish to collect.  This
  ## example collects the system uptime and interface variables.  Reference the
  ## full plugin documentation for configuration details.
  [[inputs.snmp.field]]
    oid = "RFC1213-MIB::sysUpTime.0"
    name = "uptime"

  [[inputs.snmp.field]]
    oid = "RFC1213-MIB::sysName.0"
    name = "source"
    is_tag = true

  [[inputs.snmp.table]]
    oid = "IF-MIB::ifTable"
    name = "interface"
    inherit_tags = ["source"]

    [[inputs.snmp.table.field]]
      oid = "IF-MIB::ifDescr"
      name = "ifDescr"
      is_tag = true
EOF

telegrafを再起動し、設定を反映させます。

systemctl restart telegraf.service 

ifInOctetsなどのネットワーク機器固有の情報を取得できる事を確認します。

[root@linux010 ~]# curl -s http://localhost:9273/metrics | grep -i ifInOctets
# HELP interface_ifInOctets Telegraf collected metric
# TYPE interface_ifInOctets untyped
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet0",ifIndex="1",ifPhysAddress="00:60:b9:e4:40:ad",ifSpecific=".0.0",source="NEC001"} 8.92464295e+08
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet0-Multiplexor",ifIndex="3",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 8.92464175e+08
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet0.0",ifIndex="399",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 8.92464175e+08
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet0.0-LAN",ifIndex="37",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 8.92464175e+08
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1",ifIndex="2",ifPhysAddress="00:60:b9:e4:40:6d",ifSpecific=".0.0",source="NEC001"} 3.2206956e+07
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1-Multiplexor",ifIndex="4",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 1.400076752e+09
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.0",ifIndex="400",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 1.400076752e+09
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.0-LAN",ifIndex="38",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 1.400076752e+09
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.10",ifIndex="443",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 6.2864739e+07
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.10-LAN",ifIndex="40",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 6.2864739e+07
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.2",ifIndex="435",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.2-LAN",ifIndex="39",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.20",ifIndex="453",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 192
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.20-LAN",ifIndex="41",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 192
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.30",ifIndex="463",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 2.86423266e+09
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="GigaEthernet1.30-LAN",ifIndex="42",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 2.864232569e+09
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Loopback0",ifIndex="395",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Loopback0.0",ifIndex="535",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Null0",ifIndex="397",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Null0.0",ifIndex="537",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Tunnel0",ifIndex="267",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 0
interface_ifInOctets{agent_host="192.168.69.1",host="linux010.gokatei.go",ifDescr="Tunnel0.0",ifIndex="794",ifPhysAddress="",ifSpecific=".0.0",source="NEC001"} 3.90120572e+08
[root@linux010 ~]# 

「http://<IPアドレス>:9090/graf」にて、ネットワーク機器のトラフィックなどのメトリックを取得できている事を確認します。

telegrafとネットワーク機器の連携

リモートストーレジへの転送

prometheusのメトリックの蓄積結果を外部のストレージへ転送して長期的な保管をしたい要件を想定します。このような要件で、外部のストレージがPrometheusのデータ形式に対応していればそのままの転送ができますが、Prometheusのデータ形式に対応していない場合は何らかのconverterが必要になります。

telegrafの代表的な使い方のひとつとして、Prometheusのデータを変換してInfluxdb2へ転送する使い方があります。この設定方法は「Prometheus リモートストレージ (InfluxDB v2編)」を参照ください。

タイトルとURLをコピーしました