Table of Contents
Great systems are not just built. They are monitored.
MetricFire runs Graphite and Grafana as a fully managed service for growing engineering teams, taking care of storage, scaling, and version updates so your team doesn't have to. Plans start at $19/month, billed per metric namespace rather than per host, and include engineer-staffed support. Integrations work natively with Heroku, AWS, Azure, and GCP, and data is stored with 3× redundancy in SOC2- and ISO:27001-certified data centres.
はじめに
SNMP(Simple Network Management Protocol)対応デバイスの監視は、ネットワークの健全性とセキュリティを維持するために不可欠であり、問題の早期発見と予防的なトラブルシューティングを可能にします。継続的な監視により、リソースの効率的な活用が確保され、ダウンタイムが最小限に抑えられ、ネットワーク全体のパフォーマンスが向上します。
本記事では、Telegrafエージェントを使用してSNMP(MIB)のパフォーマンス統計情報を収集し、それをデータソースに転送する方法について詳しく解説します。
Telegrafエージェントの入門
Telegrafは、InfluxDB上に構築されたプラグイン駆動型のサーバーエージェントであり、データベース、システム、プロセス、デバイス、アプリケーションからメトリクス/イベントを収集して送信します。TelegrafはGoで書かれており、外部依存関係のない単一のバイナリとしてコンパイルされ、最小限のメモリ使用量で動作します。多くのオペレーティングシステムに対応しており、さまざまなシステムパフォーマンスメトリクスを収集および転送するための多くの便利な出力プラグインおよび入力プラグインを備えています。
Telegrafのインストール(Linux / Redhat)
/etc/telegraf/ にインストールされます。wget https://dl.influxdata.com/telegraf/releases/telegraf_1.30.0-1_amd64.deb
sudo dpkg -i telegraf_1.30.0-1_amd64.deb
RedHat/CentOS
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.30.0-1.x86_64.rpm
sudo yum localinstall telegraf-1.30.0-1.x86_64.rpm
出力の設定
Telegrafは、Kafka、Graphite、InfluxDB、Prometheus、SQL、NoSQLなど、さまざまなデータ送信先に出力するよう設定できます。
この例では、Graphiteへの出力を設定します。現在データソースをホスティングしていない場合は、次の手順に進むために、MetricFireのHosted Graphiteで14日間の無料トライアルを開始してください。
Hosted Graphiteのアカウントを作成すると、データソースが提供されるほか、アラート機能や可視化ツールとしてHosted Grafanaも利用できます。
Graphite出力を設定するには、/etc/telegraf/telegraf.conf にあるダウンロード済みのtelegraf設定ファイルを見つけ、任意のテキストエディタで開きます。その後、以下の変更をファイルに加える必要があります。
まず、次の行のコメントを解除します:
[[outputs.graphite]]
次に、サーバーの行のコメントを解除し、以下のように編集します:
servers = ["carbon.hostedgraphite.com:2003"]
最後に、prefixの行のコメントを解除し、以下のように編集します:
prefix = "<YOUR_API_KEY>.telegraf"
それ以外の場合は、別のデータソースにメトリクスを送信するために、別のtelegraf出力を設定することもできます。
実行中のSNMPインスタンスの設定
この記事では、ネットワークデバイスにすでにSNMPがインストールされていることを前提としていますが、ここではLinux環境(特にUbuntu)でのSNMPのインストール/設定の簡単な手順を紹介します。
SNMP、SNMPデーモン、およびMIBパッケージダウンローダー(基本的なMIBを取得するため)をインストールします:
sudo apt install -y snmp snmpd snmp-mibs-downloader
SNMPの設定ファイル(通常は /etc/snmp/snmpd.conf にあります)を修正/設定します:
# Listen for connections from the local system only
agentAddress udp:127.0.0.1:161
# System information
sysLocation "Server Room"
sysContact admin@example.com
sysName MyComputer
# Access Control
rocommunity public
# include all available OIDs
view all included .1
次に、snmp.confファイル(通常は /etc/snmp/snmp.conf にあります)を修正/設定します:
mibs:
# expose basic MIBs
mibs +IF-MIB:HOST-RESOURCES-MIB:RFC1213-MIB:DISMAN-EVENT-MIB:DISMAN-SCHEDULE-MIB:TCP-MIB:UDP-MIB:SNMPv2-SMI:SNMPv2-TC:HOST-RESOURCES-TYPES
# optionally enable interfaces
interface eth0
- SNMPサービス/デーモンを起動します:sudo service snmpd restart
- インスタンスが停止している場合や、設定ファイルに変更を加えた場合は、実行中のSNMPプロセスを終了してから、SNMPデーモンを再起動する必要があります:sudo pkill snmpd
- 利用可能/公開されているすべてのMIBおよびOIDを確認します:snmpwalk -v2c -c public localhost .1.3.6.1
- 注:次のステップでは、この一覧を使用してTelegrafのSNMPプラグインを設定します。上記のようにGraphite出力を使用する場合、数値(整数/カウンターなど)の値を持つMIBのみを定義することができます。
TelegrafのSNMP入力プラグインの設定
Telegrafには、多くの入力プラグインがあり、さまざまな一般的な技術やサードパーティのソースから幅広いデータを収集することができます。この例では、TelegrafをローカルのSNMPインスタンスに接続する方法を説明します。
必要な作業は、telegraf.confファイル内のinputs.nginxセクションを探し、[[inputs.snmp]]の行のコメントを解除し、agentの行をコメント解除/設定することです:
[[inputs.snmp]]
agents = ["udp://127.0.0.1:161"]
次に、SNMP walkの出力に含まれるOIDに対応するSNMPフィールドを設定し、メトリクス名を定義する必要があります。
以下は基本的な設定例ですが、実際の構成はsnmpwalkの出力で定義されているOIDによって異なる場合があります。
[[inputs.snmp.field]]
oid = "HOST-RESOURCES-MIB::hrSystemUptime.0"
name = "hrSystemUptime"
[[inputs.snmp.field]]
oid = "SNMPv2-MIB::sysUpTime.0"
name = "sysUpTime"
[[inputs.snmp.field]]
oid = "DISMAN-EVENT-MIB::sysUpTimeInstance"
name = "sysUpTimeInstance"
[[inputs.snmp.field]]
oid = "TCP-MIB::tcpActiveOpens.0"
name = "tcpActiveOpens"
[[inputs.snmp.field]]
oid = "UDP-MIB::udpInDatagrams.0"
name = "udpInDatagrams"
[[inputs.snmp.field]]
oid = "SNMPv2-MIB::sysORLastChange.0"
name = "sysORLastChange"
[[inputs.snmp.field]]
oid = "IF-MIB::ifIndex.1"
name = "ifIndex"
[[inputs.snmp.field]]
oid = "IF-MIB::ifType.1"
name = "ifType"
[[inputs.snmp.field]]
oid = "IF-MIB::ifMtu.1"
name = "ifMtu"
[[inputs.snmp.field]]
oid = "IF-MIB::ifSpeed.1"
name = "ifSpeed"
[[inputs.snmp.field]]
oid = "IF-MIB::ifAdminStatus.1"
name = "ifAdminStatus"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOperStatus.1"
name = "ifOperStatus"
[[inputs.snmp.field]]
oid = "IF-MIB::ifLastChange.1"
name = "ifLastChange"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInOctets.1"
name = "ifInOctets"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInUcastPkts.1"
name = "ifInUcastPkts"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInNUcastPkts.1"
name = "ifInNUcastPkts"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInDiscards.1"
name = "ifInDiscards"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInErrors.1"
name = "ifInErrors"
[[inputs.snmp.field]]
oid = "IF-MIB::ifInUnknownProtos.1"
name = "ifInUnknownProtos"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutOctets.1"
name = "ifOutOctets"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutUcastPkts.1"
name = "ifOutUcastPkts"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutNUcastPkts.1"
name = "ifOutNUcastPkts"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutDiscards.1"
name = "ifOutDiscards"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutErrors.1"
name = "ifOutErrors"
[[inputs.snmp.field]]
oid = "IF-MIB::ifOutQLen.1"
name = "ifOutQLen"
[[inputs.snmp.field]]
oid = "SNMPv2-MIB::sysServices.0"
name = "sysServices"
[[inputs.snmp.field]]
oid = "SNMPv2-MIB::snmpOutGenErrs.0"
name = "snmpOutGenErrs"
[[inputs.snmp.field]]
oid = "RFC1213-MIB::ipForwarding.0"
name = "ipForwarding"
[[inputs.snmp.field]]
oid = "RFC1213-MIB::ipInAddrErrors.0"
name = "ipInAddrErrors"
[[inputs.snmp.field]]
oid = "HOST-RESOURCES-MIB::hrMemorySize.0"
name = "hrMemorySize"
[[inputs.snmp.field]]
oid = "HOST-RESOURCES-MIB::hrStorageUsed.53"
name = "hrStorageUsed"
[[inputs.snmp.field]]
oid = "HOST-RESOURCES-MIB::hrDeviceStatus.196608"
name = "hrDeviceStatus"
ファイルを保存したら、以下のコマンドでTelegrafを手動実行し、出力に設定エラーがないか確認できます:
telegraf --config telegraf.conf
上記の設定では、Telegrafは32個のメトリクスを設定したデータソースに転送しました。これらはGraphite形式では次のように表示されます:
telegraf.<host>.127_0_0_1.snmp.hrDeviceStatus
telegraf.<host>.127_0_0_1.snmp.hrMemorySize
telegraf.<host>.127_0_0_1.snmp.hrStorageUsed
telegraf.<host>.127_0_0_1.snmp.hrSystemUptime
telegraf.<host>.127_0_0_1.snmp.ifAdminStatus
telegraf.<host>.127_0_0_1.snmp.ifInDiscards
telegraf.<host>.127_0_0_1.snmp.ifInErrors
telegraf.<host>.127_0_0_1.snmp.ifInNUcastPkts
telegraf.<host>.127_0_0_1.snmp.ifInOctets
telegraf.<host>.127_0_0_1.snmp.ifInUcastPkts
telegraf.<host>.127_0_0_1.snmp.ifInUnknownProtos
telegraf.<host>.127_0_0_1.snmp.ifIndex
telegraf.<host>.127_0_0_1.snmp.ifLastChange
telegraf.<host>.127_0_0_1.snmp.ifMtu
telegraf.<host>.127_0_0_1.snmp.ifOperStatus
telegraf.<host>.127_0_0_1.snmp.ifOutDiscards
telegraf.<host>.127_0_0_1.snmp.ifOutErrors
telegraf.<host>.127_0_0_1.snmp.ifOutNUcastPkts
telegraf.<host>.127_0_0_1.snmp.ifOutOctets
telegraf.<host>.127_0_0_1.snmp.ifOutQLen
telegraf.<host>.127_0_0_1.snmp.ifOutUcastPkts
telegraf.<host>.127_0_0_1.snmp.ifSpeed
telegraf.<host>.127_0_0_1.snmp.ifType
telegraf.<host>.127_0_0_1.snmp.ipForwarding
telegraf.<host>.127_0_0_1.snmp.ipInAddrErrors
telegraf.<host>.127_0_0_1.snmp.snmpOutGenErrs
telegraf.<host>.127_0_0_1.snmp.sysORLastChange
telegraf.<host>.127_0_0_1.snmp.sysServices
telegraf.<host>.127_0_0_1.snmp.sysUpTime
telegraf.<host>.127_0_0_1.snmp.sysUpTimeInstance
telegraf.<host>.127_0_0_1.snmp.tcpActiveOpens
telegraf.<host>.127_0_0_1.snmp.udpInDatagrams
公式のGitHubリポジトリには、追加の設定オプションや、SNMPプラグインが返すメトリクスの完全な一覧が含まれています。
MetricFireのHosted Graphiteを使ってカスタムダッシュボードとアラートを作成
MetricFireは、サーバー、データベース、ネットワーク、デバイス、アプリケーションからメトリクスやデータを収集・可視化・分析できるモニタリングプラットフォームです。MetricFireを使用することで、問題を容易に特定し、インフラ内のリソースを最適化することができます。MetricFireのHosted Graphiteは、モニタリングソリューションを自前でホスティングする負担を取り除き、より重要な作業に時間と労力を割くことを可能にします。
Hosted Graphiteのアカウントに登録し、上記の手順でTelegrafエージェントをサーバーに設定すると、メトリクスはHosted Graphiteのバックエンドに転送され、タイムスタンプが付与され、集約されます。
- メトリクスは次のGraphite形式で送信・保存されます:metric.name.path <数値> <Unixタイムスタンプ>
- ドット区切りの形式はツリー構造のデータを提供し、クエリを効率的に行うことができます。
- メトリクスはHosted Graphiteアカウント内に2年間保存され、カスタムアラートやGrafanaダッシュボードの作成に利用できます。
Hosted GraphiteのHosted Grafanaでダッシュボードを構築
Hosted GraphiteのUIで、「Dashboards => Primary Dashboards」に移動し、「+」ボタンを選択して新しいパネルを作成します。
次に、クエリUIを使用してGraphiteのメトリクスパスを選択します(Hosted Graphiteアカウント経由でGrafanaにアクセスしている場合、デフォルトのデータソースはHosted Graphiteのバックエンドになります)。
Hosted Graphiteのデータソースは、ワイルドカード(*)検索にも対応しており、指定したパスに一致するすべてのメトリクスを取得できます。
これで、aliasByNode()のようなGraphite関数を適用して、グラフ上のメトリクス名を再フォーマットすることができます。
Grafanaには、さまざまな可視化の適用、表示の調整、測定単位の設定に加え、ダッシュボード変数の設定やイベントアノテーションといった高度な機能も多数用意されています。
詳細については、Hosted Graphiteのダッシュボードドキュメントをご参照ください。
Graphiteアラートの作成
Hosted GraphiteのUIで、「Alerts => Graphite Alerts」に移動し、新しいアラートを作成します。アラートに名前を付け、アラート対象のメトリクスフィールドにクエリを追加し、このアラートの内容を説明として入力します。
次に、「Alert Criteria」タブを選択してしきい値を設定し、通知チャネルを選択します。デフォルトの通知チャネルは、Hosted Graphiteアカウント登録時に使用したメールアドレスです。さらに、Slack、PagerDuty、Microsoft Teams、OpsGenie、カスタムWebhookなどの通知チャネルも簡単に設定できます。通知チャネルの詳細については、Hosted Graphiteのドキュメントをご参照ください。
まとめ
SNMPによる監視は、ネットワークの問題を未然に発見できるほか、パフォーマンスの最適化、ダウンタイムの最小化、そしてITインフラのセキュリティと安定性の確保につながるため、ビジネスにおけるベストプラクティスと言えます。
今すぐ無料トライアルに登録して、インフラの監視機能をぜひお試しください。また、デモをご予約いただくことも可能で、監視に関するニーズについてMetricFireチームに直接ご相談いただけます。