New RelicのFlex機能を使ったICMP PING監視

記事タイトルとURLをコピーする

みなさんこんにちは。ネコが好きなマネージドサービス部の塩野です。
最近だいぶ寒くなりましたが、いかがお過ごしでしょうか。なんとなくコタツで丸くなりたい気分ですw

概要

New RelicのFlex機能を使ったICMP PING監視について書いていきます

記事の対象者

  • New Relicを使ったFLEX監視について知りたい人。
  • ネットワーク監視について知りたい人。

Flex監視とは

こちらの記事でも概要は記載しましたが、WindowsやLinuxなどにインストールするインフラストラクチャエージェントからコマンドを叩いた結果を使ってやる監視のことです。

blog.serverworks.co.jp

構成図と当記事のゴール

当記事で使用する環境の構成図はこちらです

Linux Serverにインストールされたインフラストラクチャエージェントからnr-ktranslateサーバに対してPING監視ができるところをゴールとします。 前提条件として、対象インスタンスにPINGが通っていることを事前に確認しておきます。

Flex監視の設定

1.ガイドの通りインフラストラクチャエージェントをインストールします

といっても何ら難しいことはありません。Linux(又はWindows)にログインして、インストールガイドから出力されたコマンドを対象OSで実行するだけです。



2.Flexの設定を追加します

2-1./etc/newrelic-infra/integrations.d/ 配下にping-nrflex.ymlというファイルを作成します

sudo touch /etc/newrelic-infra/integrations.d/ping-nrflex.yml

2-2.作成したファイルに下記の設定を書き込みます

integrations:
  - name: nri-flex
    interval: 60s
    config:
      name: FlexIntegrationPing
      apis:
        - event_type: FlexIntegrationPing
          commands:
            - run: ping 10.0.17.181 -c 1 -w 1 |grep transmitted |xargs -ICT echo 'resultping:CT'
              split_by: ":"
              custom_attributes:
                checkhost: nr-host
                checkip: 10.0.17.181

3.インフラストラクチャエージェントを再起動します

sudo systemctl restart newrelic-infra

Flex監視の動作確認

ちゃんと設定できていれば、Metrics & Events>EventsにFlexIntegrationPingという項目が追加されていることを確認できます。これはintegrations>config>apis>event_type の名称が表示されていますので、もし任意の名称に変更したい場合はevent_type の名称を書き換えてください。さて、監視データですが意図した通りデータが送信されていることが確認できますが、監視設定で使用するクエリは下記グラフの表示結果とは別となりますのでご留意ください。


それでは、監視対象インスタンスをシャッドダウンして動作確認してみましょう。
監視設定で使用するクエリはこちらになります。

SELECT count(*) FROM FlexIntegrationPing FACET checkip 
WHERE  checkip = '10.0.17.181' and resultping like '%1 received%' 
SINCE 30 MINUTES AGO TIMESERIES

監視対象のインスタンスがシャットダウンされた後はグラフが0となりましたので意図した通りPING監視できていることが確認できました。

Flex監視のオプションと設計思想

YAMLファイルの構成について、もう少し深堀していきましょう。

YAMLファイルのベース部分は API commands の機能を使用しています。こちらはNew Relic FlexのAPIドキュメント 上は「任意のアプリケーションまたはシェルコマンドから情報を取得する機能」と明記されています。

つまり、最低限必要な部分としては下記の通りとなります。

integrations:
  - name: nri-flex
      apis:
        - event_type: イベントタイプを表す名称を記載
          commands:
            - run: データを取得するコマンドを記載

あとはここで出力されたコマンドをどのようなタイミングで、どのようにNew Relicに取り込むか、という点でYAMLファイルを書き上げていけばやりたいことは実現できるでしょう。

「どのようなタイミングで」の部分は、なんとなく察しがつくと思いますが、その察しの内容で問題ありません。YAMLコードの interval の後ろの数字を任意の時間に変更してあげるだけでデータ取得タイミングを変更できます。

integrations:
  - name: nri-flex
    interval: 60s  ←ここ
 :

最後に「どのようにNew Relicに取り込むか」の部分を見ていきましょう。

まずは取り込む部分を考える前に、コマンド結果をNew Relic側でどのようにデータを表示してほしいかを考えながら、runに記載するコマンドを考える必要があります。 つまり、runコマンドを考える時点でNRQLクエリをどう書くかが想像できていないといけないということになります。

普通に考えると「そんなもんわかるかー」と言われかねませんが、ちょっと待ってください。NRQLで「Select count(*) from <値を集める箱の名前> where <なんかの名前>='<検索したい内容>'」の「値を集める箱の名前」、「なんかの名前」、「検索したい内容」を考えるだけなので、結局は決めの問題になります。

では、そのあたりの背景も踏まえつつ、今回の設定をどのように作りこんでいったかを見てみましょう。それを知るためにはまず、runに記載しているコマンドが成功した場合、失敗した場合にどのような結果が返ってくるかを知る必要があります。ローカル環境で監視先IPを変更してそれぞれPING成功時、PING失敗時の結果とNRQLを見比べてみましょう。

■PING成功時
$ ping 127.0.0.1 -c 1 -w 1 |grep transmitted |xargs -ICT echo 'resultping:CT'
resultping:1 packets transmitted, 1 received, 0% packet loss, time 0ms

■PING失敗時
$ ping 128.0.0.1 -c 1 -w 1 |grep transmitted |xargs -ICT echo 'resultping:CT'
resultping:1 packets transmitted, 0 received, 100% packet loss, time 0ms

■使用したNRQL
SELECT count(*) FROM FlexIntegrationPing FACET checkip 
WHERE  checkip = '10.0.17.181' and resultping like '%1 received%' 
SINCE 30 MINUTES AGO TIMESERIES

コマンド結果とNRQLの中で一番注目してほしいのは、resultping like '%1 received%' の部分。今回 resultping はNew Relicの内部データ上タイトル扱いとして登録しています。つまり、タイトル : 出力結果 の出力結果で、出力結果に特定の文字列が含まれることを期待したクエリとなっていることを読み取ることができます。今回のケースの場合は、resultpingの中に「1 received」が含まれているかどうかを判定しています。だからICMPが成功した時はPINGオプションの count = 1 の設定で 1 received が表示されますし、失敗すれば 0 received で 100% packet loss となるためNRQLで対象データが無しの判定がされるので、この監視設計がどのような意図で監視成功時にどのような結果を期待して設計されたかが分かると思います。

コマンドの出力設計からYAMLの構成に話を戻しますが、split_by: ":" の部分は コマンド結果の分割で前の説明の通りタイトルとコマンド結果を分けているのがこの部分です。次にcustom_attributesですが、いわゆる検索ラベルと認識頂ければと思います。あってもいいですしなくてもいいのですが、今回の場合resultpingの結果にPINGの宛先が含まれないため意図的にラベルを付けています。

ここまでの内容を踏まえた上でもう一度YAMLファイルを見てみましょう。最初に何気なく設定していた頃よりもずいぶん色々なものが見えるようになったのではないでしょうか。

integrations:
  - name: nri-flex
    interval: 60s
    config:
      name: FlexIntegrationPing
      apis:
        - event_type: FlexIntegrationPing
          commands:
            - run: ping 10.0.17.181 -c 1 -w 1 |grep transmitted |xargs -ICT echo 'resultping:CT'
              split_by: ":"
              custom_attributes:
                checkhost: nr-host
                checkip: 10.0.17.181

まとめ

Flexを使ったPING監視はあくまでもオマケのスタンスで、こういう風にすれば一応監視することもできるよ?というものになります。とはいえ、Network 監視設定の敷居も高くてどうしよう・・という話であればこういったトリッキーな選択肢もひとつではないかと思います。

個人的なお願いごと

弊社内の運用基盤でもNew Relicを使った監視をしており、その中で蓄積されたノウハウや知見などに興味がある方が多くいらっしゃる場合は、個人的にこういったブログ記事を増やしたりユーザーグループなどでの発表を増やしてもいいのかと考えています。もし興味がある、もっとこの手の情報を知りたいという方が多くいらっしるようであれば、こういうのも書いてとリクエストを添えた上で記事の拡散の際ににご協力頂ければ嬉しいです。

関連記事

New Relicを使ったPING監視の実情
blog.serverworks.co.jp

New RelicでICMP PING監視~KTranslateを使った監視設定方法~
blog.serverworks.co.jp

塩野 正人 ブログ記事一覧はコチラ

マネージドサービス部所属。ネコが好きです。