New Relic Insights: 独自データを送って、ビジネス分析の幅を広げよう

Advent Calendar 7日目もデジカの宮澤が担当します。昨日の続きで、New Relic Insights についてです。今日は、昨日も言及した独自データの送信方法について説明します。

独自データを送れるようになると、Insights の利用の幅が非常に広がり、強力なBIツールになります。弊社でも、ざまざまな独自データを送ることで、ビジネスの見える化を促進しており、また、外部のお客様へのプレゼンにも非常に役立っています。ぜひ、使ってみてください。

# カスタムイベントとは

エージェントには、カスタムイベントという機能があります。これを使うと、New Relic Insights に対して、新しいイベントタイプ（APM の Transactions や Browser の PageView に相当）ができます。送信されたカスタムイベントは、Data Explore で確認することができます。

# 事前準備（ライセンスキーの取得)

カスタムイベントを送るには、事前に New Relic の設定画面から、Insights API 用のライセンスキーを取得しておく必要があります。取得方法は、以下の通りです。

![insights_license_key.png](https://qiita-image-store.s3.amazonaws.com/0/46003/63b9c05c-3686-8e9e-c796-47eb242d6972.png)

`+` ボタンを押すと以下に遷移する。

![insight_license_key2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/389ced2d-0874-ac07-fccd-87e4caf0f81d.png)

`Key` にある値をコピーして使ってください。

※ このキーは複数発行可能です。

# 送り方

データの送信は、以下のように、JSON フォーマットで行います。

```
[
  {
    "eventType":"Purchase",
    "account":3,
    "amount":259.54
  },
  {
    "eventType":"Purchase",
    "account":5,
    "amount":12309,
    "product":"Super expensive thing"
  }
]
```

"eventType" は、必須です。イベントタイプ名となります。(APM の Transactions に相当)
Value は、`""` で囲む（例: "3"）と文字列扱い。囲まない（例: 259.54)と小数扱いになります。この2つ以外の形式（配列や真偽値など）では送れません。詳しくは、[サポートしているデータタイプ](https://docs.newrelic.com/docs/insights/new-relic-insights/decorating-events/insights-custom-attributes#caveats)をご覧ください。また、日時データも、独特な扱いなので、日時データを送りたい方も、観てみてください。


## cURL を使っての送信方法

上記のスクリーンショットにも載っていますが、cURL を使ったカスタムイベントの送信方法は以下のようになります。

```
cat example_events.json | curl -d @- -X
  POST -H "Content-Type: application/json" -H "X-Insert-Key: YOUR_KEY_HERE"
  https://insights-collector.newrelic.com/v1/accounts/YOUR_ACCOUNT_ID/events
```

`YOUR_KEY_HERE` と `YOUR_ACCOUNT_ID` の部分は自身の値と入れ替えて使ってください。Insightsを使える方であれば、上記のスクリーンショットのように画面上に表示されるのをコピペして使うと簡単です。（すでにそれらの値が入った状態のため）

以下は、実行例です。成功すると、success が返ってきます。

```
> curl -X POST -H "Content-Type: application/json" -H "X-Insert-Key:YOUR_KEY_HERE" -d '[{"eventType":"Purchase","account":3,"amount":259.54},{"eventType":"Purchase","account":5,"amount":12309,"product":"Super expensive thing"}]' https://insights-collector.newrelic.com/v1/accounts/YOUR_ACCOUNT_ID/events

{"success": true}%
```

## エージェントを利用したカスタムイベントの送信方法

上記では、cURL の方法を書きましたが、やはり一般的な使い方は、アプリの中から送るのが多いと思います。各エージェントには、そのための API が用意されています。それを使えば簡単に送ることができます。このデータは、呼び出しタイミングで送られるわけではなく、60秒に一度送られるようです。（基本的に、New Relic APM 自体が60秒ごとにデータを送信しているので、おそらく同じタイミングでおくっているのだと思います）

どうやら Python だけは、API が用意されていないようです。

Ruby

```rb
::NewRelic::Agent.record_custom_event('WidgetSale', color: 'red', weight: 12.5)
```

Java

```java
Map<String, Object> eventAttributes = new HashMap<String, Object>();
NewRelic.getAgent().getInsights().recordCustomEvent('MyCustomEvent', eventAttributes);
```

.NET

```csharp
var eventAttributes = new Dictionary<String, Object>();
NewRelic.Api.Agent.NewRelic.RecordCustomEvent('MyCustomEvent', eventAttributes);
```

PHP

```php
newrelic_record_custom_event("WidgetSale", array("color"=>"red", "weight"=>12.5));
```

Node.js

```js
recordCustomEvent(eventType, attributes)
```

注意点として、あまりにも大量に送ると、メモリに影響を与えるのと、上記の言語でも古いバージョンだと上記の API が使えなかったりするので、使う際は、バージョンを確認してください。

詳しい説明や、予約語やデータサイズ制限などは[Inserting custom events via New Relic APM agents](https://docs.newrelic.com/docs/insights/new-relic-insights/adding-querying-data/inserting-custom-events-new-relic-apm-agents)をご覧ください。

また、ブラウザからもカスタムイベントを送れるようです。そのための、JavaScript の API も用意されています。[Inserting custom events and attributes via the Insights JavaScript API](https://docs.newrelic.com/docs/insights/new-relic-insights/adding-querying-data/inserting-custom-events-attributes-insights-javascript-api) を参考にしてみてください。

# ビュー

送信されたカスタムイベントは、Insights の Data Explorer 上で確認できます。もちろん直接 NRQL 書いてもいいけど。

![スクリーンショット 2015-12-07 22.01.28.png](https://qiita-image-store.s3.amazonaws.com/0/46003/5a9a688e-d821-68f8-3479-8edaf880244a.png)

NRQL でも `eventType` の "Purchase" を `from` に指定して、簡単に確認できます。

![スクリーンショット 2015-12-07 22.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/46003/f7208dc0-2a04-b80a-ad2c-fe7e9fb9c558.png)


# おわりに

どうでしたでしょうか？カスタムイベントのイメージが湧いたでしょうか。最初にも書きましたが、これは使い方しだいで、ビジネス分析が非常に簡単に素早く行えるようになります。是非、使ってみてください。