小ネタです。
こんにちは、大城です。AS部IE課での研修を卒業して2023年3月からマネージドサービス部に本配属となりました。
マネージドサービス部に配属されてから、New Relicを触ることが多くなってきました。New Relicのドキュメントを漁ってカスタムメトリクスの送信を試してみたのでブログに残したいと思います。
New Relicについては弊社ブログでもいくつか記事があるので宜しければこちらもご覧ください。
はじめに
New Relicで用意されているエージェントを利用することで様々なメトリクスが取れます。標準で取得できるメトリクスでも運用するには必要十分なメトリクスがあります。追加でシステムやアプリケーションの要件に合わせてカスタムメトリクスを収集することで、より要件にあったメトリクスが収集でき、きめ細かい運用が期待できます。例えば下のようなユースケースが考えられます。
- DBで特定テーブルの件数を収集し、バッチ実行時間帯の容量推移を確認する
- アプリケーションで問題となりそうなデータを抽出し件数を把握する
- アプリケーションスレッドの生死を収集し、より細かいヘルスチェックをする
ドキュメント
いきなり結論ですが、エンドポイントが用意されているので、このドキュメント通りにPOSTすればカスタムメトリクスを送信することができます。ドキュメントが機械翻訳の日本語になっているため英語にして確認することをおすすめします。
カスタムメトリクス送信で必要なもの
Api-Key
ドキュメントにある通りlicense typeのキーを取得します
左下のユーザーアイコンからAPI Keysをクリック
license typeのキーをCopy Keyでコピーします
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 という名前でメトリクスが送信されていることが分かります。
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
今回 attributes は1つしか設定していませんが、要件に合わせて attributes を追加することで様々な切り口でグラフが作れそうです。
最後に
ここまで読んで頂きありがとうございます。New Relicまだまだ勉強中なので、また何かネタがあったらブログ書きます。
大城 慶明 (記事一覧)
マネージドサービス部
2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS13冠。NRUG沖縄支部運営。X @yo_ohshiro