2017/11/11

翻訳: New Relic APM が Node のバージョン 8 に対応したよ

Node.js の New Relic ユーザーに朗報です。Node 8 や async/await も New Relic でモニタリングできるようになりました。Node 8 に対する記事ですが、New Relic の最新のテクノロジーに対する姿勢なども垣間見える記事となっています。Node ユーザーは是非、エージェントを最新版にアップグレードして試してみてください。


タイトル: New Relic APM Now Supports Node 8
著者: Shreyans Parekh
公開日: 2017.11.08


New Relic では、アプリケーションパフォーマンスモニタリング (APM) は、最新かつ最高のテクノロジプラットフォームで利用できなくてはならないと考えています。そして、私たちは、長い間、Node.js エコシステムにコミットし、最新バージョンのNode.js に対するタイムリーなサポートを New Relic ユーザーに提供してきました。

その結果、New Relic の Node.js エージェントのバージョン 2.3.0 がリリースできました。今回のリリースでは、機能フラグで提供してきた Node 8用の async/await キーワードのサポートがデフォルトで有効になりました。

コードネーム Carbon として公開された Node 8 は、もともと Nodejs.org が4月下旬にリリースする予定でした。しかあし、Node に新しい JavaScript の実行パイプラインである Ignition と TurboFan を含む Google の V8 JavaScript エンジンのバージョンを統合できるようにリリースを延期しました。5月末に Node 8 がリリースされた直後に、私達は、Node 8 の最初のサポートバージョンをリリースしました。その後も、Async/Await をサポートするなどアップデートを繰り返してきました。

Node 8 は機能が満載

Node.js 8.0.0 には、JavaScript エンジン の V8 5.8 が載っています。これは、JavaScript ランタイムのアップデートであり、パフォーマンス及び開発者向けの API が大幅に改善されています。Node 8 自体にもエキサイティングする点がたくさんあります。

N-API の紹介: 最も重要な新機能の1つは、N-API モジュールです。これは、Node.js の今後のすべてのバージョンで安定した ABI(Application Binary Interface) を提供することを目指して追加されてものです。この新しい API は、基礎となる JavaScript エンジンの変更の影響からアドオンを保護し、あるバージョン用にコンパイルされたネイティブモジュールを再コンパイルせずに新しいバージョンの Node.js で実行できるようにすることを目的としています。

async/await のサポート: もう一つの重要な機能は async と await キーワードの導入です。Node 7.6.0 は機能フラグなしの非同期機能をサポートした最初のバージョンでした。Node 8 は非同期機能サポートする最初の LTS (ロングタームサポート) バージョンです。LTS リリースであるため、この機能はすぐにコミュニティに採用されました。新しく追加された await キーワードと組み合わせることで、Promises をよりクリーンで読みやすくできます。

Promises は「コールバック地獄」から抜け出すために大きな前進を遂げました。以下では2つの例の比較を紹介します。どちらも同じ内容を実行しています。昔ながらのコールバックスタイルで書くと以下のようになります。


function callbackStyle(cb) {
  doSomething((err, something) => {
    if (err) {
      cleanupSomething()
      return cb(err)
    }
    doSomethingMore(something, (err, more) => {
      if (err) {
        cleanupMore()
        return cb(err)
      }
      doFinalSomething(more, (err, final) => {
        if (err) {
          cleanupFinal()
          return cb(err)
        }
        cb(final)
      })
    })
  })
}
function promiseStyle() {
  return doSomething()
    .then((something) => doSomethingMore(something))
    .then((more) => doSomethingFinal(more))
    .catch((err) => {
      cleanupEverything()
      throw err
    })
}

新しい非同期関数( async function )は Promises の上に構築されています。よって、上記で示した非同期コードは、以下のように、同期コードのようにわかりやすく書き直すことができます。


async function awaitStyle() {
  try {
    const something = await doSomething()
    const more = await doSomethingMore(something)
    return await doSomethingFinal(more)
  } catch (err) {
    cleanupEverything()
    throw err
  }
}

こでだけでも、使用してみる価値があるでしょう。でも、待ってください。async はもっといろいろできるのです。この非同期関数は、単純な手続き型のコードを分かりやすくするだけでなく、以下のように非同期のループも分かりやすくすることができるのです。


async function awaitMapSeries(items, asyncModifier) {
  const out = new Array(items.length)
  for (let i = 0; i < items.length; ++i) {
    out[i] = await asyncModifier(items[i], i, items)
  }
  return out
}
async function awaitMapParallel(items, asyncModifier) {
  return await Promise.all(items.map(asyncModifier))
}

すごくないですか?

Async Hooks API を使用すると、Node の非同期操作をモニタリングできます

最後に、Async Hooks (非同期フック)を使うことで、Node の非同期操作全体の状態を監視、追跡できます。これは、より優れた診断ツールの基礎を築く助けになるでしょう。Async Hooks は、Node 8 の開発サイクルの後のほうで追加されました。このことにより、New Relic の Node 8 に対する初期のサポートから、async/await をサポートしないという決定を下す大きな要因となりました。async/await の計測を実装するために Async Hooks を活用したいと考えましたが、成熟度を監視し、Async Hook を使って構築したソリューションを適切にテストして、検証するための時間が必要でした。

新しい "await" 構文を使って MongoDB からデータを取得する非同期ミドルウェアの例
上記(MongoDB)のデータストア操作の結果を待っている(awaiting)時間を示すトランザクショントレースの例

改善や機能リリースにより、Node.js 開発者にとってよりシームレスなワークフローが確立されるでしょう。パフォーマンスも大幅に向上する可能性もあるでしょう。New Relic の Async/Await サポートについては、New Relic Node.js のドキュメントをご覧ください。

Qiita で New Relic Advent Calendar 2017 いろいろ書きました。特に、New Relic APM の入門的な連載を書きましたので、是非、ご覧ください。

New Relic 公式の日本 New Relic ユーザー会を立ち上げました。ワークショップの情報など日本のお客様向けに情報を発信していきますので、是非、参加ください。

過去記事

2018/09/13

翻訳: FutureStack18: New Relic 開発者向けプログラム-オープン化、シンプル化、活発化への道

今年も始まりました。New Relic の年次カンファレンス FutureStack 18。
この記事では、Elixir 用の New Relic APM エージェントの発表とデベロッパープログラムの発表がされています。

続きを読む

2018/08/27

翻訳: New Relic APM 新機能: 分散トレーシング

New Relic APM にDistributed Tracing (分散トレーシング)機能が追加されました。メニュー単位で機能が追加されたのはだいぶなかったのではないかと思います。マイクロサービスにおけるサービスをまたがったデータの流れを可視化できる機能のようです。是非、チェックしてみてください。

続きを読む

2018/05/18

SREcon18 と Rails デベロッパー向けアンケート結果の紹介

SRECon America カンファレンスにおけるアンケートの記事と Rails デベロッパーに対するアンケートの記事という2つの異なったレイヤーのアンケートに関する記事を見つけたので、ざっくり紹介します。違った視点での傾向が見れてなかなか面白いです。

続きを読む

2018/05/11

AWS Summit Tokyo を中心に直近の New Relic 関連イベントのご紹介

5/30 から始まる AWS summit Tokyo に参加するということで、海外から New Relic スタッフが来日し、イベント等を行います。是非、この機会に New Relic に興味のある人は参加してみてはいかがでしょうか。(基本、日本人スタッフいるので、日本語でも大丈夫なはず)

続きを読む

2018/03/17

翻訳: New Relic Browser JavaScript Error Analytics ベータ版 – エラーの早期発見、修正に役立つ

New Relic Browser の JS エラー機能が新しくなるようです (現在ベータ版)。APM で採用されているエラープロファイルが JS エラーにも対応したようです。これによって、エラーが起きている傾向が分析できるようになり、今後の JS のエラーが起きる前に対策が取りやすくなります。既存の PRO ユーザーはベータ版が使えるようなので、是非、使ってみてください。

続きを読む

 もっと見る