【小ネタ】bash標準出力をNew Relicカスタムメトリクスに送信する

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

小ネタです。

こんにちは、大城です。AS部IE課での研修を卒業して2023年3月からマネージドサービス部に本配属となりました。 マネージドサービス部に配属されてから、New Relicを触ることが多くなってきました。New Relicのドキュメントを漁ってカスタムメトリクスの送信を試してみたのでブログに残したいと思います。

New Relicについては弊社ブログでもいくつか記事があるので宜しければこちらもご覧ください。

blog.serverworks.co.jp

blog.serverworks.co.jp

blog.serverworks.co.jp

はじめに

New Relicで用意されているエージェントを利用することで様々なメトリクスが取れます。標準で取得できるメトリクスでも運用するには必要十分なメトリクスがあります。追加でシステムやアプリケーションの要件に合わせてカスタムメトリクスを収集することで、より要件にあったメトリクスが収集でき、きめ細かい運用が期待できます。例えば下のようなユースケースが考えられます。

  • DBで特定テーブルの件数を収集し、バッチ実行時間帯の容量推移を確認する
  • アプリケーションで問題となりそうなデータを抽出し件数を把握する
  • アプリケーションスレッドの生死を収集し、より細かいヘルスチェックをする

ドキュメント

いきなり結論ですが、エンドポイントが用意されているので、このドキュメント通りにPOSTすればカスタムメトリクスを送信することができます。ドキュメントが機械翻訳の日本語になっているため英語にして確認することをおすすめします。

docs.newrelic.com

カスタムメトリクス送信で必要なもの

Api-Key

ドキュメントにある通りlicense typeのキーを取得します
左下のユーザーアイコンからAPI Keysをクリック

api-key1

license typeのキーをCopy Keyでコピーします

api-key2

httpクライアント

bashだとcurlで、その他言語では用意されているhttpクライアントを利用すればOKです。

サンプルスクリプト

bashの標準出力をカスタムメトリクスとしてNew Relicに送信してみます。まずはじめに0から100を出力する単純なbashを作成しました

・/tmp/num_gene.sh

#!/bin/bash
echo -n $(( $RANDOM % 100 + 1 ))

このbashの実行結果(標準出力)をNew Relicに送信します。今回はRuby 3.1で作成しました。

・/tmp/post_newrelic.rb
 ・第1引数に実行するbashスクリプトを指定
 ・第2引数にホスト名を指定(attributesで使う)

require 'net/http'
require 'uri'
require 'json/add/core'
require 'open3'
APIKEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
sh = ARGV[0]
o, e, s = Open3.capture3(sh)
post_num = o.to_i
# コマンド失敗したら「0」を入れておく
post_num = 0 unless s.success?
uri = URI.parse('https://metric-api.newrelic.com/metric/v1')
headers = { 'Content-Type': 'application/json', 'Api-Key': APIKEY}
req = Net::HTTP::Post.new(uri.request_uri, headers)
host_name = ARGV[1]
params =  [{ 
            'metrics': [{
              'name': 'custom.test.metrics',
              'type': 'gauge',
              'value': post_num,
              'timestamp': Time.now.to_i,
              'attributes': {'host.name': host_name}
            }]
          }]
req.body = params.to_json
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start do |h|
  _res = h.request(req)
end

今回サンプルなのでAPIKEYはベタ書きしていますが、実際に使うときには認証情報は外だしすることをおすすめします。これを下のように実行します。1分毎に15分程度実行してみました。

ruby /tmp/post_newrelic.rb /tmp/num_gene.sh dev.server
ruby /tmp/post_newrelic.rb /tmp/num_gene.sh stg.server
ruby /tmp/post_newrelic.rb /tmp/num_gene.sh prd.server

メトリクス確認

New Relic上でメトリクスを確認してみます。
Query Your Data -> Metrics から custom.test.metrics という名前でメトリクスが送信されていることが分かります。

Metrics

NRQLで attributes に設定した host.name 単位でグラフを出してみます。dev.server、stg.server、prd.server 単位でグラフが表示されます。

SELECT latest(`custom.test.metrics`) FROM Metric FACET `host.name` SINCE 10 MINUTES AGO TIMESERIES

NRQL

今回 attributes は1つしか設定していませんが、要件に合わせて attributes を追加することで様々な切り口でグラフが作れそうです。

最後に

ここまで読んで頂きありがとうございます。New Relicまだまだ勉強中なので、また何かネタがあったらブログ書きます。

大城 慶明 (記事一覧)

マネージドサービス部

2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS12冠。NRUG沖縄支部運営。X @yo_ohshiro