みなさんこんにちは。マネージドサービス部MSS課の塩野(正)です。
New Relicのネットワーク監視(NPM)について度々話題に取り上げていますが、 NPMサーバで使用しているktranslateの設定ファイル snmp-base.yaml で気になる点がありましたので、 その内容と実際にどのような挙動を示すのか調査した結果を記事にまとめました。
目次
- 目次
- 記事の概要
- 実際の挙動を確認する
- 追記: 2025/08/03
- まとめ
- 宣伝
記事の概要
元ネタはこちらになりますが、New Relicのネットワーク監視(NPM)ではICMPやSNMP、Syslog、NetFlowの監視を行うことができます。 その中で、どのデバイスに対してどのようなタイミングで監視をするかという設定を定義する snmp-base.yaml ファイルの記載内容で 各デバイスに対してのポーリングタイミングはglobalセクションとdevicesセクションのどちらでも設定できるようになっています。
で、どちらの設定がどのように監視設定に影響するのかという観点でみると、公式ドキュメントには以下のように記載されていますが、 実際の挙動と公式ドキュメントの内容に差異があるのではないかということで、動作検証をした記事になります。
公式ドキュメントの情報を整理する
公式ドキュメントに記載されているグローバルセクションの poll_time_sec には以下のような記載がありました。
デバイスをポーリングする時間(秒単位)。これは、 devices.
.poll_time_sec属性を使用してデバイスごとにオーバーライドできます。デフォルトでは、 60に設定されています。
公式ドキュメントに記載されているデバイスセクションの poll_time_sec には以下のような記載がありました。
SNMPポーリング頻度を秒単位で示します。この設定は、 global.poll_time_sec属性を上書きするために使用されます。
実際の挙動を確認する
globalセクション=devicesセクションで、ping_interval_secを10秒にした場合
ドキュメント上は、最小ポーリングタイミングが30秒となっていることから基本的には30秒以下でポーリングできない認識ですが、実際にできないのか30秒間隔でポーリングするのか試してみました。
snmp-base.yamlの設定
devices: ping_only__10.0.17.52: device_name: ping_only device_ip: 10.0.17.52 provider: kentik-ping ping_only: true ping_interval_sec: 10 global: poll_time_sec: 10 mib_profile_dir: /etc/ktranslate/profiles mibs_db: /etc/ktranslate/mibs.db timeout_ms: 3000
実施結果
想定通り30秒間隔でポーリングしていることがわかりました。 そのため、最短間隔でpingを打ちたい場合は ping_interval_sec を 30 とするのがよさそうです。

globalセクション>devicesセクションにした場合
今度はglobalセクションのping_interval_secをdevicesセクションより大きくしてみました。
設定概要は下記の通り
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 120 (sec) | 60 (sec) |
snmp-base.yamlの設定
devices: ping_only__10.0.17.52: device_name: ping_only device_ip: 10.0.17.52 provider: kentik-ping ping_only: true ping_interval_sec: 60 global: poll_time_sec: 120 mib_profile_dir: /etc/ktranslate/profiles mibs_db: /etc/ktranslate/mibs.db timeout_ms: 3000
実施結果
globalセクションで設定した間隔でポーリングしていることがわかりました。 globalセクションの値は、全体のポーリング間隔の基準ではありますが、より短い方の値を設定するのがよさそうです。

globalセクション<devicesセクションにした場合
今度はdevicesセクションのping_interval_secをglobalセクションより大きくしてみました。
設定概要は下記の通り
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 30 (sec) | 60 (sec) |
snmp-base.yamlの設定
devices: ping_only__10.0.17.52: device_name: ping_only device_ip: 10.0.17.52 provider: kentik-ping ping_only: true ping_interval_sec: 60 global: poll_time_sec: 30 mib_profile_dir: /etc/ktranslate/profiles mibs_db: /etc/ktranslate/mibs.db timeout_ms: 3000
実施結果
動作確認した結果、なんとデータが送信されませんでした! ドキュメント上では、devicesセクションの値で上書きしていると記載されていますが、 下記のdockerのログを見る限り Sending 0 probes となっていることから、ひとつの可能性として送信対象として認識されていないと推測されます。
少なくともSending x probesが0以上の場合はNew Relic側に何らかのデータが送信されており、Sending x probesが0の場合は何度試してもデータ送信されない状況でした。
globalセクション<devicesセクション時のdockerログ
参考)設定値
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 30 (sec) | 60 (sec) |
ktrans-ping | 2025-05-23T08:03:56.695 ktranslate/ [Info] KTranslate monitorMetricsInput Starting ktrans-ping | 2025-05-23T08:03:56.696 ktranslate/ [Info] KTranslate Turning off HTTP server. ktrans-ping | 2025-05-23T08:03:56.696 ktranslate/ [Info] KTranslate do sendToKTranslate Starting ktrans-ping | 2025-05-23T08:03:56.704 ktranslate/ [Info] KTranslate>ping_only Pinger reset to interval: 1m0s, count: 0 ktrans-ping | 2025-05-23T08:03:56.704 ktranslate/ [Info] KTranslate>ping_only snmpPing: First run will be at 2025-05-23 08:04:08.720189445 +0000 UTC. Running every 30s, Sending 0 probes
globalセクション=devicesセクション時のdockerログ
参考)設定値
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 30 (sec) | 30 (sec) |
ktrans-ping | 2025-05-23T08:08:40.613 ktranslate/ [Info] KTranslate monitorMetricsInput Starting ktrans-ping | 2025-05-23T08:08:40.613 ktranslate/ [Info] KTranslate Turning off HTTP server. ktrans-ping | 2025-05-23T08:08:40.613 ktranslate/ [Info] KTranslate do sendToKTranslate Starting ktrans-ping | 2025-05-23T08:08:40.627 ktranslate/ [Info] KTranslate>ping_only Pinger reset to interval: 30s, count: 1 ktrans-ping | 2025-05-23T08:08:40.627 ktranslate/ [Info] KTranslate>ping_only snmpPing: First run will be at 2025-05-23 08:09:03.606450741 +0000 UTC. Running every 30s, Sending 1 probes
globalセクション>devicesセクション時のdockerログ
参考)設定値
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 60 (sec) | 30 (sec) |
ktrans-ping | 2025-05-23T08:10:17.875 ktranslate/ [Info] KTranslate monitorMetricsInput Starting ktrans-ping | 2025-05-23T08:10:17.875 ktranslate/ [Info] KTranslate Turning off HTTP server. ktrans-ping | 2025-05-23T08:10:17.875 ktranslate/ [Info] KTranslate do sendToKTranslate Starting ktrans-ping | 2025-05-23T08:10:17.883 ktranslate/ [Info] KTranslate>ping_only Pinger reset to interval: 30s, count: 2 ktrans-ping | 2025-05-23T08:10:17.883 ktranslate/ [Info] KTranslate>ping_only snmpPing: First run will be at 2025-05-23 08:11:12.224853666 +0000 UTC. Running every 1m0s, Sending 2 probes
おまけ:devicesセクションのping_interval_secを削除した場合
globalセクション<devicesセクションにした場合の状況から、devicesのping_interval_secの値は重要な意味を持つ可能性があるため、 一応devicesセクションに ping_interval_sec がなくても動作するかどうかという観点で確認してみました。
設定概要は下記の通り
| section name | global | devices |
|---|---|---|
| ping_interval_sec | 30 (sec) | N/A |
snmp-base.yamlの設定
devices: ping_only__10.0.17.52: device_name: ping_only device_ip: 10.0.17.52 provider: kentik-ping ping_only: true global: poll_time_sec: 30 mib_profile_dir: /etc/ktranslate/profiles mibs_db: /etc/ktranslat
docker起動時のログ
ktrans-ping | 2025-05-23T08:30:09.143 ktranslate/ [Info] KTranslate monitorMetricsInput Starting ktrans-ping | 2025-05-23T08:30:09.143 ktranslate/ [Info] KTranslate Turning off HTTP server. ktrans-ping | 2025-05-23T08:30:09.143 ktranslate/ [Info] KTranslate do sendToKTranslate Starting ktrans-ping | 2025-05-23T08:30:09.153 ktranslate/ [Info] KTranslate>ping_only Pinger reset to interval: 1m0s, count: 0 ktrans-ping | 2025-05-23T08:30:09.153 ktranslate/ [Info] KTranslate>ping_only snmpPing: First run will be at 2025-05-23 08:30:41.716906999 +0000 UTC. Running every 30s, Sending 0 probes
実施結果
なんとなく起動時のログでその後の状況が推測できてしまうのがアレな感じですが、予想通りデータ送信されませんでした。
追記: 2025/08/03
New RelicでICMP監視を行う際のパラメータはNew Relic社のドキュメントを見る限り下記のものが影響しているように見受けられます。
公式ドキュメントより引用
| セクション | キー名 | 説明 |
|---|---|---|
| device | ping_only | trueの場合、すべての SNMP ポーリングを無効にし、このデバイスの 応答時間 ポーリングを有効にします。この設定は、 global.response_time 属性をオーバーライドします。デフォルトでは、 falseに設定されています。各 ping_only デバイスに行 provider: kentik_ping が含まれていることを確認してください。 |
| device | ping_interval_sec | この設定は、 ping_only の間に使用される1パケット/秒のデフォルトレートを上書きするために使用されます。 response_timeポーリング。 |
| global | poll_time_sec | デバイスをポーリングする時間(秒単位)。これは、 devices. |
しかしながら、Kentik社のKtranslateの機能を紐解くとICMP監視(PING)の機能はSNMPのサブセットとして実装されていることがドキュメントなどから読み取ることができます。つまり、ドキュメントに書かれている「ping_only の間に使用される1パケット/秒のデフォルトレートを上書きするため」を鵜呑みにするのはよくなくて、実際にポーリング間隔を決めているのは ping_interval_sec ではなく poll_time_sec になります。
公式ドキュメントより引用
| セクション | キー名 | 説明 |
|---|---|---|
| device / global | poll_time_sec | SNMPポーリング頻度を秒単位で示します。この設定は、 global.poll_time_sec属性を上書きするために使用されます。 |
でも、上記記載をみるだけでは「でも公式ドキュメントにはこう書いてるし、そんな訳ないでしょ?」となるはずです。では、もう少し深堀してみてみましょう。
幸いなことに Ktranslate のパッケージはソースコードが公開されているため、コードから挙動を紐解くことができます。つまりドキュメントの記載があっているかどうかの判断材料が別に存在するという事になります。
今回確認すべきファイルは、pkg/inputs/snmp/metrics/poll.go と util.go というファイルです。こういう状況になるとOps側がDev側に寄り添ってコード解析をする必要があるのが少し難儀になりますが、実際のコードはこの部分です。まず、 下記の counterAlignment が実際のポーリングタイミングを決めている部分になり、その値を決めているのが p.counterTimeSec の部分になります。
// Simpler loop which only runs on ping data, no actual snmp polling. func (p *Poller) StartPingOnlyLoop(ctx context.Context) { if p.pinger == nil { p.log.Errorf("Missing pinger in ping loop.") return } p.pinger.Start(ctx) counterAlignment := time.Duration(p.counterTimeSec) * time.Second
次に、counterTimeSec を決めているのは、util.GetPollRateの関数でここでは設定ファイルから取得した情報を元にその値を決めていることが分かります。
func NewPoller(server *gosnmp.GoSNMP, gconf *kt.SnmpGlobalConfig, conf *kt.SnmpDeviceConfig, jchfChan chan []*kt.JCHF, metrics *kt.SnmpDeviceMetric, profile *mibs.Profile, log logger.ContextL, logchan chan string) *Poller { counterTimeSec := util.GetPollRate(gconf, conf, log)
最後にその関数を紐解いてみますが、SnmpGlobalConfig(グローバル設定)やSnmpDeviceConfig(デバイス設定)から値を参照しており、参照している値は「PollTimeSec」、つまりpoll_time_sec がポーリング間隔を決めているキーになります。
func GetPollRate(gconf *kt.SnmpGlobalConfig, conf *kt.SnmpDeviceConfig, log logger.ContextL) int { // Default poll rate is 5 min. This is what a lot of SNMP billing is on. counterTimeSec := 5 * 60 if conf != nil && conf.PollTimeSec > 0 { counterTimeSec = conf.PollTimeSec } else if gconf != nil && gconf.PollTimeSec > 0 { counterTimeSec = gconf.PollTimeSec } // Lastly, enforece a min polling interval. if counterTimeSec < 30 { log.Warnf("%d poll time is below min of 30. Raising to 30 seconds", counterTimeSec) counterTimeSec = 30 } return counterTimeSec }
なので、ポーリング間隔を決めるファクターは ping_interval_sec ではなく poll_time_sec となることにご留意ください。
参考資料
まとめ
あくまでも私の検証結果から推察した推奨設定となりますが、ポーリング間隔についてはglobalセクションとdevicesセクションは同じ値を使用し、どちらも値を設定する方がいいのではないかと推測します。 この記事がどなたかのお役に立てれば幸いです。
宣伝
弊社では、お客様環境のオブザーバビリティを加速するためのNew Relicアカウント開設を含めた伴走型のNew Relic導入支援サービスをご提供しております。 もしご興味をお持ちの方は、こちらのお問合せフォームよりお問合せ頂けましたら幸いでございます。