Terraformは、クラウドやオンプレミスのリソースを定義し、管理する際に有用ですが、動的なダッシュボードを作成したい場合には、簡単ではないことがあります。このブログでは、ライブデータをもとにダッシュボードを動的に作成するためのNRQL(New Relic クエリ言語)の使用方法について学びます。

今回はシリーズの第3部になります。第1部では、TerraformでJSONテンプレートを使用し、New Relicダッシュボードを作成する方法についてご紹介しています。第2部では、シンプルな入力データから複雑な動的ダッシュボードを構築する方法をご紹介しています。

今回の例では、どのNew Relicアカウントでも無料で使用できるグローバルAPIを使用します。今回は、NRQLを使用して過去24時間で最も利用された上位5位のAPIのダッシュボードを構築します。これをTerraformの設定を一切変えずに行えるようになります。これが第2部で学んだこととの違いです。前回は、ダッシュボードを動的に作成しましたが、準備した入力をもとに作成したダッシュボードの列は静的でした。今回のケースでは、表示される列はデータそのものに基づきます。この例では、どのAPIがもっとも多くのコールを受けているかによって、列が変化します。

Terraformプロバイダーは、このようなタイプのダッシュボードを作成するのに活用できます。New RelicのGraphQL APIのクエリによって上位5位のAPIのデータを取得し、そのデータに基づいてダッシュボードを作成します。この例を適用して、パフォーマンス上位のアプリケーション、製品、過負荷サーバー、またはその他経時的に変化しうるあらゆる注目データに関するダッシュボードを自動的に作成できます。

完成したダッシュボードは、以下のように表示されます。

ダッシュボード向けのTerraform設定は、dash_nrql_composed.tfにあります。

クエリを定義する

まず、GraphQLクエリを定義する必要があります。この例では、count()を使用して、上位5位のドメインを調べます。これは、Terraform設定とは別のファイルで定義できます。そうすることで、それ自体のクエリコードの確認と更新がしやすくなります。このケースでは、ファイル名はgetTopFiveApis.gqlです.

query ($accountId: Int!) {
  actor {
    account(id: $accountId) {
      nrql(query: "SELECT count(*) from Public_APICall facet api as domain  since 1 day ago limit 5") {
        results
      }
    }
  }
}

クエリを定義したら、その名称を指定する必要があります。これはGraphQLプロバイダーのデータ機能で行えます。なお、入力変数として定義できるAPIキーを指定する必要があります。以下のコードは、dash_nrql_composed.tfにあります。

variable NEW_RELIC_API_KEY { 
    type = string
}

provider "graphql" {
  url = "https://api.newrelic.com/graphql" #US data center API url
  headers = {
    "API-Key" = var.NEW_RELIC_API_KEY
  }
}

data "graphql_query" "basic_query" {
  query_variables = { 
    accountId = var.accountId
  }
  query     = file("./getTopFiveApis.gql")
}

ここでは何が行われているのでしょうか?まず、New RelicのAPIキーのための新たな入力変数を定義する必要があります。GraphQLプロバイダーは、New Relicにアクセスする際にこのキーを使用します。また、プロバイダーはアカウントIDも必要としますが、これはすでにprovider.tfで定義されています。提供されたリポジトリでruntf.shファイルを使用している場合には、ここで行われます。そうでない場合、READMEで説明されているように、アカウントIDを引数としてTerraformコマンドに送る必要があります。

次に、API URLとヘッダーの「APIキー」を指定して、認証に必要なGraphQLプロバイダーを設定します。アカウントがEUのデータセンターにある場合、EUのAPI URL(api.eu.newrelic.com)を使用しなくてはなりません。

最後に、プロバイダからのgraphql_queryデータ機能を使用して、New RelicのGraphQL APIにクエリを行います。ここでは、アカウントIDをクエリ変数として指定し、先に作成したGraphQLクエリファイルを参照します。

ダッシュボードを作成する

次に、NRQLクエリの結果をtemplatefile()機能のCONFIG値に送ります。以下のコードは、/dash_nrql_composedにあります。

locals {
  template_render = templatefile(
               "${path.module}/dashboards/composed_widgets.json.tftpl",
{
                 ACCOUNTID = var.accountId
                 CONFIG = jsondecode(data.graphql_query.basic_query.query_response).data.actor.account.nrql.results
               }
        )
}

resource "newrelic_one_dashboard_json" "nrql_dashboard" {
   json = local.composed_render
}

jsondecode()機能が、結果から必要なデータを抽出し、それをCONFIG変数に割り当てます。CONFIGデータの形は、クエリの結果のデータとなっているため、前述のパートと少し違って見えます。

jsondecode(data.graphql_query.basic_query.query_response).data.actor.account.nrql.results

テンプレートファイル(dashboards/nrql_composed_widgets.json.tftpl)は、CONFIGオブジェクトのNRQLクエリにより返されたAPIを通じて反復し、各API向けのダッシュボード列を生成します。このファイルの機能の詳細は、本シリーズ第2部のダッシュボードウィジェットの作成をご参照ください。ここでも、ダッシュボードを動的に作成するための反復を使用しています。

このTerraform設定を適用すると、合計コールによる上位5位のパブリックAPIのリストが取得できます。この変更を適用するたびに、最新データを使用してダッシュボードが生成されます。

まとめ

本ブログでは、TerraformとJSONを使用して、NRQLクエリに基づきNew Relicで動的ダッシュボードを作成する方法について学びました。この手法を、現実世界のデータを使って、動的に変化するダッシュボードの構築に活用しましょう。たとえば、人気のプロダクト、予定表のイベント、パフォーマンスの悪いサーバーなどに基づいてダッシュボードを作成できます。

このパターンを適切に使いこなすには、ダッシュボード設定の頻繁な再適用が必要です。これはイベントスによりケジューリングやトリガーが可能で、コードとしてのオブザーバビリティガイドで説明されているようなCI/CD Workflowを使用して管理するのが最適です。

まだこのシリーズのコードについて詳細を確認していない方は、nr-terraform-json-dashboard-examplesリポジトリをご覧ください。カスタムダッシュボードをすばやく立ち上げるのにご活用いただけます。